In [1]:
import cv2
import numpy as np
import glob
import matplotlib

import matplotlib.pyplot as plt
In [2]:
import src.CameraCalibration as cc

Camera Calibration

In [3]:
calibration = cc.Calibration('./camera_cal', 'jpg', 9, 6)
calibration.cameraCalibration(_drawCorner = True)
total image : 20
In [4]:
calibration.undistort_list(calibration.getDataList())
In [5]:
test_img_list = glob.glob('./test_images/*.jpg')
In [6]:
fig_und = plt.figure(figsize=(24, 9))
fig_und.suptitle('original image (left) & undistort result (right)', fontsize=20)
for i, _filename in enumerate(test_img_list) :
    img = cv2.cvtColor(cv2.imread(_filename), cv2.COLOR_BGR2RGB)
    und_img = calibration.undistort(img)
    und = fig_und.add_subplot(4, 4, 2 * i + 1)
    und.imshow(img)
    und = fig_und.add_subplot(4, 4, 2 * i + 2)
    und.imshow(und_img)
plt.show()

warp

In [20]:
# src_p = np.float32([[535, 490], [770, 490], [1090, 660], [290, 660]])
src_p = np.float32([[535, 490], [770, 490], [1100, 719], [190, 719]])
dst_p = np.float32([[320, 0], [1000, 0], [1000, 720 - 1], [320, 720 - 1]])
M = cv2.getPerspectiveTransform(src_p, dst_p)
# print (test_img_list[4])
# img = cv2.cvtColor(cv2.imread(test_img_list[6]), cv2.COLOR_BGR2RGB)
# und_img = calibration.undistort(img)
# warped = cv2.warpPerspective(und_img, M, (img.shape[1], img.shape[0]))
# plt.imshow(warped)
# f = plt.show()

fig_und = plt.figure(figsize=(24, 9))
fig_und.suptitle('undistort image (left) & warp result (right)', fontsize=20)
for i, _filename in enumerate(test_img_list) :
    img = cv2.cvtColor(cv2.imread(_filename), cv2.COLOR_BGR2RGB)
    und_img = calibration.undistort(img)
    warped = cv2.warpPerspective(und_img, M, (img.shape[1], img.shape[0]))
    und = fig_und.add_subplot(4, 4, 2 * i + 1)
    und.imshow(und_img)
    und = fig_und.add_subplot(4, 4, 2 * i + 2)
    und.imshow(warped)
f = plt.show()
In [8]:
import src.Filters as F
In [21]:
gradF = F.gradFilters(_sobel_x_thresh=(30, 100), 
                    _sobel_y_thresh=(30, 100), 
                    _mag_thresh=(30, 100), 
                    _dir_thresh=(0.0, 0.4))

colorF = F.colorFilter()

fig_und = plt.figure(figsize=(24, 18))
fig_und.suptitle('warped image & grad result (x, y, mag., dir., color, combine(x, color))', fontsize=20)
for i, _filename in enumerate(test_img_list) :
    img = cv2.cvtColor(cv2.imread(_filename), cv2.COLOR_BGR2RGB)
    und_img = calibration.undistort(img)
    warped = cv2.warpPerspective(und_img, M, (img.shape[1], img.shape[0]))
    
    _, _ = gradF.compute_mag_grad(warped, 3)
    _ = gradF.compute_dir(warped, 21)

    xFilter = gradF.getXgradFilter()
    yFilter = gradF.getYgradFilter()
    magFilter = gradF.getMagFilter()
    dirFilter = gradF.getDirFilter()
    
    colorFilter = colorF.getColorFilter(warped, (120, 255))
    
    combine = np.zeros_like(colorFilter)
    combine[(xFilter == 1) | (colorFilter == 1)] = 1
    
    und = fig_und.add_subplot(8, 7, 7 *i + 1)
    und.imshow(warped)
    und = fig_und.add_subplot(8, 7, 7 * i + 2)
    und.imshow(xFilter, cmap='gray')
    und = fig_und.add_subplot(8, 7, 7 * i + 3)
    und.imshow(yFilter, cmap='gray')
    und = fig_und.add_subplot(8, 7, 7 * i + 4)
    und.imshow(magFilter, cmap='gray')
    und = fig_und.add_subplot(8, 7, 7 * i + 5)
    und.imshow(dirFilter, cmap='gray')
    und = fig_und.add_subplot(8, 7, 7 * i + 6)
    und.imshow(colorFilter, cmap='gray')
    und = fig_und.add_subplot(8, 7, 7 * i + 7)
    und.imshow(combine, cmap='gray')
    
f = plt.show()
In [10]:
import src.FindingLane as FLane
In [236]:
finder = FLane.Lane()
finder.processing(combine, warped,_visualization = True)
plt.imshow(finder.out_img)
plt.show()
In [237]:
finder.processing(combine, warped, _visualization = True)
plt.imshow(finder.result)
plt.show()

unwarp

In [22]:
inv_M = cv2.getPerspectiveTransform(dst_p, src_p)
sign_img = np.ones_like(finder.result) * 255
inv_warped = cv2.warpPerspective(finder.result, inv_M, (img.shape[1], img.shape[0]))
inv_sign_img = cv2.warpPerspective(sign_img, inv_M, (img.shape[1], img.shape[0]))
In [14]:
plt.imshow(inv_warped)
plt.show()
In [45]:
cover = np.zeros_like(xFilter)
cover[:, 130:1150] = 1
plt.imshow(cover, cmap='gray')
plt.show()
In [43]:
colorFilter_cp = np.copy(colorFilter)
colorFilter_cp[(cover == 0)] = 0
plt.imshow(colorFilter_cp)
plt.show()
In [15]:
processed_img = cv2.cvtColor(cv2.imread(test_img_list[-1]), cv2.COLOR_BGR2RGB)
processed_img[(inv_sign_img == 255)] = inv_warped[(inv_sign_img == 255)]
plt.imshow(processed_img)
plt.show()
In [163]:
from moviepy.editor import VideoFileClip
from IPython.display import HTML
In [233]:
# Lfinder = FLane.Lane()
Lfinder = Lane()
cover = np.zeros_like(xFilter)
cover[:, 150:1200] = 1
def processing_image(image) :
    und_image = calibration.undistort(image)
    warped_image = cv2.warpPerspective(und_image, M, (img.shape[1], img.shape[0]))
    _, _ = gradF.compute_mag_grad(warped_image, 3)
#     _ = gradF.compute_dir(warped_image, 21)

    xFilter = gradF.getXgradFilter()
    yFilter = gradF.getYgradFilter()
#     magFilter = gradF.getMagFilter()
#     dirFilter = gradF.getDirFilter()
    
    colorFilter = colorF.getColorFilter(warped_image, (100, 255))
    
    xFilter[(cover == 0)] = 0
    yFilter[(cover == 0)] = 0
    colorFilter[(cover == 0)] = 0
    
    combine_Bin_image = np.zeros_like(colorFilter)
    combine_Bin_image[(((xFilter == 1) & (yFilter ==1))==1) | (colorFilter == 1)] = 1
    
    diff_dis, mean_r = Lfinder.processing(combine_Bin_image, warped_image, _visualization = True)
#     print (diff_dis)
    
    
    inv_warped_image = cv2.warpPerspective(Lfinder.result, inv_M, (image.shape[1], image.shape[0]))
    und_image[(inv_sign_img == 255)] = inv_warped_image[(inv_sign_img == 255)]
    
    text = 'on the center.'
    
    if (diff_dis > 0) :
        text = 'right of center : %f m'%(diff_dis)
    elif (diff_dis < 0) :
        text = 'left of center : %f m'%(-diff_dis)
        
    cv2.putText(und_image, ('Radius of Curvature : %d m'%(np.int(mean_r))), (50,70), cv2.FONT_HERSHEY_SIMPLEX, 1,(255, 255, 0), 2, cv2.LINE_AA)
    cv2.putText(und_image, text, (50,150), cv2.FONT_HERSHEY_SIMPLEX, 1,(255, 255, 0), 2, cv2.LINE_AA)
#     cv2.putText(Lfinder.result, 'diffs_right')
    
#     cv2.putText(Lfinder.result, ('left 0: %f, 1: %f, 2: %f'%(Lfinder.diffs_left[0], Lfinder.diffs_left[1], Lfinder.diffs_left[2])), (50,70), cv2.FONT_HERSHEY_SIMPLEX, 1,(255, 255, 0), 2, cv2.LINE_AA)
#     cv2.putText(Lfinder.result, ('right 0: %f, 1: %f, 2: %f'%(Lfinder.diffs_right[0], Lfinder.diffs_right[1], Lfinder.diffs_right[2])), (50,150), cv2.FONT_HERSHEY_SIMPLEX, 1,(255, 255, 0), 2, cv2.LINE_AA)
    
#     text_l = 'F'
#     text_r = 'F'
#     if (Lfinder.detected_left):
#         text_l = 'T'
#     if (Lfinder.detected_right):
#         text_r = 'T'
    
#     cv2.putText(Lfinder.result, text_l, (50,70), cv2.FONT_HERSHEY_SIMPLEX, 1,(255, 255, 0), 2, cv2.LINE_AA)
#     cv2.putText(Lfinder.result, text_r, (50,150), cv2.FONT_HERSHEY_SIMPLEX, 1,(255, 255, 0), 2, cv2.LINE_AA)

    
    
    return und_image
#     return Lfinder.result
#     combine_Bin_image = combine_Bin_image * 255
#     return np.dstack((combine_Bin_image, combine_Bin_image, combine_Bin_image))
In [234]:
output_dir = 'output_images/project_video_output.mp4'
clip1 = VideoFileClip('project_video.mp4')#.subclip(17, 37)
output_clip = clip1.fl_image(processing_image)
%time output_clip.write_videofile(output_dir, audio=False)
[MoviePy] >>>> Building video output_images/project_video_output.mp4
[MoviePy] Writing video output_images/project_video_output.mp4








  0%|          | 0/1261 [00:00<?, ?it/s]








  0%|          | 1/1261 [00:00<03:19,  6.33it/s]








  0%|          | 2/1261 [00:00<03:27,  6.07it/s]








  0%|          | 3/1261 [00:00<03:25,  6.13it/s]








  0%|          | 4/1261 [00:00<03:21,  6.24it/s]








  0%|          | 5/1261 [00:00<03:22,  6.21it/s]








  0%|          | 6/1261 [00:01<03:36,  5.81it/s]








  1%|          | 7/1261 [00:01<04:02,  5.17it/s]








  1%|          | 8/1261 [00:01<04:31,  4.62it/s]








  1%|          | 9/1261 [00:01<05:03,  4.13it/s]








  1%|          | 10/1261 [00:02<05:22,  3.88it/s]








  1%|          | 11/1261 [00:02<05:35,  3.73it/s]








  1%|          | 12/1261 [00:02<05:11,  4.00it/s]








  1%|          | 13/1261 [00:02<04:46,  4.35it/s]








  1%|          | 14/1261 [00:03<04:46,  4.35it/s]








  1%|          | 15/1261 [00:03<04:33,  4.56it/s]








  1%|▏         | 16/1261 [00:03<04:37,  4.49it/s]








  1%|▏         | 17/1261 [00:03<04:11,  4.94it/s]








  1%|▏         | 18/1261 [00:03<04:01,  5.14it/s]








  2%|▏         | 19/1261 [00:03<03:46,  5.49it/s]








  2%|▏         | 20/1261 [00:04<03:50,  5.38it/s]








  2%|▏         | 21/1261 [00:04<04:05,  5.06it/s]








  2%|▏         | 22/1261 [00:04<04:09,  4.97it/s]








  2%|▏         | 23/1261 [00:04<03:55,  5.26it/s]








  2%|▏         | 24/1261 [00:04<04:03,  5.08it/s]








  2%|▏         | 25/1261 [00:05<04:09,  4.95it/s]








  2%|▏         | 26/1261 [00:05<04:21,  4.73it/s]








  2%|▏         | 27/1261 [00:05<04:03,  5.07it/s]








  2%|▏         | 28/1261 [00:05<03:51,  5.32it/s]








  2%|▏         | 29/1261 [00:05<03:38,  5.64it/s]








  2%|▏         | 30/1261 [00:06<03:42,  5.54it/s]








  2%|▏         | 31/1261 [00:06<03:36,  5.67it/s]








  3%|▎         | 32/1261 [00:06<03:56,  5.19it/s]








  3%|▎         | 33/1261 [00:06<04:03,  5.04it/s]








  3%|▎         | 34/1261 [00:06<04:06,  4.98it/s]








  3%|▎         | 35/1261 [00:07<03:53,  5.25it/s]








  3%|▎         | 36/1261 [00:07<03:41,  5.54it/s]








  3%|▎         | 37/1261 [00:07<03:26,  5.92it/s]








  3%|▎         | 38/1261 [00:07<03:23,  6.02it/s]








  3%|▎         | 39/1261 [00:07<03:23,  5.99it/s]








  3%|▎         | 40/1261 [00:07<03:18,  6.14it/s]








  3%|▎         | 41/1261 [00:07<03:15,  6.25it/s]








  3%|▎         | 42/1261 [00:08<03:14,  6.28it/s]








  3%|▎         | 43/1261 [00:08<04:00,  5.06it/s]








  3%|▎         | 44/1261 [00:08<04:12,  4.82it/s]








  4%|▎         | 45/1261 [00:08<03:55,  5.17it/s]








  4%|▎         | 46/1261 [00:08<03:44,  5.40it/s]








  4%|▎         | 47/1261 [00:09<03:40,  5.50it/s]








  4%|▍         | 48/1261 [00:09<03:57,  5.12it/s]








  4%|▍         | 49/1261 [00:09<03:48,  5.29it/s]








  4%|▍         | 50/1261 [00:09<04:18,  4.69it/s]








  4%|▍         | 51/1261 [00:10<04:15,  4.74it/s]








  4%|▍         | 52/1261 [00:10<04:04,  4.94it/s]








  4%|▍         | 53/1261 [00:10<03:50,  5.25it/s]








  4%|▍         | 54/1261 [00:10<03:43,  5.40it/s]








  4%|▍         | 55/1261 [00:10<03:42,  5.42it/s]








  4%|▍         | 56/1261 [00:10<03:35,  5.59it/s]








  5%|▍         | 57/1261 [00:11<03:28,  5.77it/s]








  5%|▍         | 58/1261 [00:11<03:21,  5.98it/s]








  5%|▍         | 59/1261 [00:11<03:17,  6.10it/s]








  5%|▍         | 60/1261 [00:11<03:19,  6.02it/s]








  5%|▍         | 61/1261 [00:11<03:17,  6.08it/s]








  5%|▍         | 62/1261 [00:11<03:17,  6.08it/s]








  5%|▍         | 63/1261 [00:12<03:14,  6.15it/s]








  5%|▌         | 64/1261 [00:12<03:14,  6.15it/s]








  5%|▌         | 65/1261 [00:12<03:11,  6.25it/s]








  5%|▌         | 66/1261 [00:12<03:09,  6.32it/s]








  5%|▌         | 67/1261 [00:12<03:08,  6.34it/s]








  5%|▌         | 68/1261 [00:12<03:12,  6.18it/s]








  5%|▌         | 69/1261 [00:12<03:10,  6.26it/s]








  6%|▌         | 70/1261 [00:13<03:07,  6.36it/s]








  6%|▌         | 71/1261 [00:13<03:04,  6.44it/s]








  6%|▌         | 72/1261 [00:13<03:06,  6.36it/s]








  6%|▌         | 73/1261 [00:13<03:05,  6.40it/s]








  6%|▌         | 74/1261 [00:13<03:04,  6.44it/s]








  6%|▌         | 75/1261 [00:13<03:03,  6.48it/s]








  6%|▌         | 76/1261 [00:14<03:06,  6.36it/s]








  6%|▌         | 77/1261 [00:14<03:06,  6.35it/s]








  6%|▌         | 78/1261 [00:14<03:04,  6.41it/s]








  6%|▋         | 79/1261 [00:14<03:02,  6.46it/s]








  6%|▋         | 80/1261 [00:14<03:08,  6.27it/s]








  6%|▋         | 81/1261 [00:14<03:07,  6.28it/s]








  7%|▋         | 82/1261 [00:15<03:06,  6.33it/s]








  7%|▋         | 83/1261 [00:15<03:04,  6.39it/s]








  7%|▋         | 84/1261 [00:15<03:10,  6.19it/s]








  7%|▋         | 85/1261 [00:15<03:08,  6.23it/s]








  7%|▋         | 86/1261 [00:15<03:07,  6.27it/s]








  7%|▋         | 87/1261 [00:15<03:04,  6.35it/s]








  7%|▋         | 88/1261 [00:15<03:10,  6.15it/s]








  7%|▋         | 89/1261 [00:16<03:07,  6.24it/s]








  7%|▋         | 90/1261 [00:16<03:05,  6.32it/s]








  7%|▋         | 91/1261 [00:16<03:04,  6.35it/s]








  7%|▋         | 92/1261 [00:16<03:06,  6.27it/s]








  7%|▋         | 93/1261 [00:16<03:04,  6.32it/s]








  7%|▋         | 94/1261 [00:16<03:02,  6.40it/s]








  8%|▊         | 95/1261 [00:17<03:01,  6.41it/s]








  8%|▊         | 96/1261 [00:17<03:06,  6.26it/s]








  8%|▊         | 97/1261 [00:17<03:04,  6.31it/s]








  8%|▊         | 98/1261 [00:17<03:01,  6.41it/s]








  8%|▊         | 99/1261 [00:17<02:58,  6.52it/s]








  8%|▊         | 100/1261 [00:17<02:59,  6.49it/s]








  8%|▊         | 101/1261 [00:17<02:56,  6.58it/s]








  8%|▊         | 102/1261 [00:18<02:55,  6.60it/s]








  8%|▊         | 103/1261 [00:18<02:55,  6.59it/s]








  8%|▊         | 104/1261 [00:18<02:59,  6.46it/s]








  8%|▊         | 105/1261 [00:18<02:57,  6.51it/s]








  8%|▊         | 106/1261 [00:18<02:56,  6.53it/s]








  8%|▊         | 107/1261 [00:18<02:54,  6.63it/s]








  9%|▊         | 108/1261 [00:19<02:58,  6.45it/s]








  9%|▊         | 109/1261 [00:19<02:57,  6.50it/s]








  9%|▊         | 110/1261 [00:19<02:55,  6.57it/s]








  9%|▉         | 111/1261 [00:19<02:52,  6.65it/s]








  9%|▉         | 112/1261 [00:19<02:55,  6.56it/s]








  9%|▉         | 113/1261 [00:19<02:55,  6.55it/s]








  9%|▉         | 114/1261 [00:19<02:53,  6.60it/s]








  9%|▉         | 115/1261 [00:20<02:55,  6.51it/s]








  9%|▉         | 116/1261 [00:20<03:01,  6.32it/s]








  9%|▉         | 117/1261 [00:20<02:59,  6.38it/s]








  9%|▉         | 118/1261 [00:20<02:59,  6.37it/s]








  9%|▉         | 119/1261 [00:20<02:57,  6.44it/s]








 10%|▉         | 120/1261 [00:20<02:58,  6.38it/s]








 10%|▉         | 121/1261 [00:21<02:56,  6.46it/s]








 10%|▉         | 122/1261 [00:21<02:54,  6.53it/s]








 10%|▉         | 123/1261 [00:21<02:53,  6.55it/s]








 10%|▉         | 124/1261 [00:21<02:56,  6.45it/s]








 10%|▉         | 125/1261 [00:21<02:55,  6.49it/s]








 10%|▉         | 126/1261 [00:21<02:53,  6.55it/s]








 10%|█         | 127/1261 [00:21<02:52,  6.59it/s]








 10%|█         | 128/1261 [00:22<02:59,  6.31it/s]








 10%|█         | 129/1261 [00:22<02:57,  6.37it/s]








 10%|█         | 130/1261 [00:22<02:53,  6.51it/s]








 10%|█         | 131/1261 [00:22<02:53,  6.53it/s]








 10%|█         | 132/1261 [00:22<02:55,  6.42it/s]








 11%|█         | 133/1261 [00:22<02:53,  6.49it/s]








 11%|█         | 134/1261 [00:23<02:50,  6.60it/s]








 11%|█         | 135/1261 [00:23<02:49,  6.66it/s]








 11%|█         | 136/1261 [00:23<02:52,  6.52it/s]








 11%|█         | 137/1261 [00:23<02:51,  6.55it/s]








 11%|█         | 138/1261 [00:23<02:50,  6.60it/s]








 11%|█         | 139/1261 [00:23<02:49,  6.63it/s]








 11%|█         | 140/1261 [00:23<02:53,  6.47it/s]








 11%|█         | 141/1261 [00:24<02:51,  6.53it/s]








 11%|█▏        | 142/1261 [00:24<02:50,  6.57it/s]








 11%|█▏        | 143/1261 [00:24<02:50,  6.56it/s]








 11%|█▏        | 144/1261 [00:24<02:54,  6.41it/s]








 11%|█▏        | 145/1261 [00:24<02:52,  6.46it/s]








 12%|█▏        | 146/1261 [00:24<02:50,  6.53it/s]








 12%|█▏        | 147/1261 [00:25<02:51,  6.51it/s]








 12%|█▏        | 148/1261 [00:25<02:54,  6.36it/s]








 12%|█▏        | 149/1261 [00:25<02:52,  6.44it/s]








 12%|█▏        | 150/1261 [00:25<02:50,  6.53it/s]








 12%|█▏        | 151/1261 [00:25<02:49,  6.57it/s]








 12%|█▏        | 152/1261 [00:25<02:52,  6.42it/s]








 12%|█▏        | 153/1261 [00:26<02:51,  6.47it/s]








 12%|█▏        | 154/1261 [00:26<02:52,  6.43it/s]








 12%|█▏        | 155/1261 [00:26<02:49,  6.53it/s]








 12%|█▏        | 156/1261 [00:26<02:52,  6.42it/s]








 12%|█▏        | 157/1261 [00:26<02:53,  6.37it/s]








 13%|█▎        | 158/1261 [00:26<02:51,  6.43it/s]








 13%|█▎        | 159/1261 [00:26<02:49,  6.51it/s]








 13%|█▎        | 160/1261 [00:27<02:53,  6.34it/s]








 13%|█▎        | 161/1261 [00:27<02:51,  6.40it/s]








 13%|█▎        | 162/1261 [00:27<02:50,  6.45it/s]








 13%|█▎        | 163/1261 [00:27<02:49,  6.48it/s]








 13%|█▎        | 164/1261 [00:27<02:52,  6.34it/s]








 13%|█▎        | 165/1261 [00:27<02:49,  6.45it/s]








 13%|█▎        | 166/1261 [00:28<02:47,  6.55it/s]








 13%|█▎        | 167/1261 [00:28<02:46,  6.58it/s]








 13%|█▎        | 168/1261 [00:28<02:47,  6.51it/s]








 13%|█▎        | 169/1261 [00:28<02:46,  6.58it/s]








 13%|█▎        | 170/1261 [00:28<02:44,  6.64it/s]








 14%|█▎        | 171/1261 [00:28<02:43,  6.68it/s]








 14%|█▎        | 172/1261 [00:28<02:49,  6.43it/s]








 14%|█▎        | 173/1261 [00:29<02:48,  6.47it/s]








 14%|█▍        | 174/1261 [00:29<02:46,  6.54it/s]








 14%|█▍        | 175/1261 [00:29<02:44,  6.59it/s]








 14%|█▍        | 176/1261 [00:29<02:50,  6.36it/s]








 14%|█▍        | 177/1261 [00:29<02:48,  6.44it/s]








 14%|█▍        | 178/1261 [00:29<02:45,  6.53it/s]








 14%|█▍        | 179/1261 [00:30<02:43,  6.60it/s]








 14%|█▍        | 180/1261 [00:30<02:47,  6.46it/s]








 14%|█▍        | 181/1261 [00:30<02:46,  6.49it/s]








 14%|█▍        | 182/1261 [00:30<02:45,  6.52it/s]








 15%|█▍        | 183/1261 [00:30<02:45,  6.53it/s]








 15%|█▍        | 184/1261 [00:30<02:48,  6.40it/s]








 15%|█▍        | 185/1261 [00:30<02:47,  6.44it/s]








 15%|█▍        | 186/1261 [00:31<02:45,  6.49it/s]








 15%|█▍        | 187/1261 [00:31<02:45,  6.50it/s]








 15%|█▍        | 188/1261 [00:31<02:48,  6.35it/s]








 15%|█▍        | 189/1261 [00:31<02:46,  6.43it/s]








 15%|█▌        | 190/1261 [00:31<02:46,  6.43it/s]








 15%|█▌        | 191/1261 [00:31<02:43,  6.54it/s]








 15%|█▌        | 192/1261 [00:32<02:46,  6.41it/s]








 15%|█▌        | 193/1261 [00:32<02:44,  6.50it/s]








 15%|█▌        | 194/1261 [00:32<02:45,  6.46it/s]








 15%|█▌        | 195/1261 [00:32<02:42,  6.55it/s]








 16%|█▌        | 196/1261 [00:32<02:47,  6.35it/s]








 16%|█▌        | 197/1261 [00:32<02:45,  6.43it/s]








 16%|█▌        | 198/1261 [00:32<02:43,  6.51it/s]








 16%|█▌        | 199/1261 [00:33<02:42,  6.54it/s]








 16%|█▌        | 200/1261 [00:33<02:43,  6.48it/s]








 16%|█▌        | 201/1261 [00:33<02:41,  6.55it/s]








 16%|█▌        | 202/1261 [00:33<02:41,  6.57it/s]








 16%|█▌        | 203/1261 [00:33<02:38,  6.66it/s]








 16%|█▌        | 204/1261 [00:33<02:44,  6.44it/s]








 16%|█▋        | 205/1261 [00:34<02:42,  6.49it/s]








 16%|█▋        | 206/1261 [00:34<02:40,  6.58it/s]








 16%|█▋        | 207/1261 [00:34<02:39,  6.60it/s]








 16%|█▋        | 208/1261 [00:34<02:41,  6.51it/s]








 17%|█▋        | 209/1261 [00:34<02:40,  6.56it/s]








 17%|█▋        | 210/1261 [00:34<02:39,  6.61it/s]








 17%|█▋        | 211/1261 [00:34<02:37,  6.66it/s]








 17%|█▋        | 212/1261 [00:35<02:38,  6.61it/s]








 17%|█▋        | 213/1261 [00:35<02:37,  6.65it/s]








 17%|█▋        | 214/1261 [00:35<02:36,  6.70it/s]








 17%|█▋        | 215/1261 [00:35<02:34,  6.79it/s]








 17%|█▋        | 216/1261 [00:35<02:36,  6.66it/s]








 17%|█▋        | 217/1261 [00:35<02:36,  6.69it/s]








 17%|█▋        | 218/1261 [00:35<02:35,  6.70it/s]








 17%|█▋        | 219/1261 [00:36<02:34,  6.75it/s]








 17%|█▋        | 220/1261 [00:36<02:40,  6.47it/s]








 18%|█▊        | 221/1261 [00:36<02:39,  6.50it/s]








 18%|█▊        | 222/1261 [00:36<02:37,  6.59it/s]








 18%|█▊        | 223/1261 [00:36<02:37,  6.58it/s]








 18%|█▊        | 224/1261 [00:36<02:41,  6.41it/s]








 18%|█▊        | 225/1261 [00:37<02:39,  6.48it/s]








 18%|█▊        | 226/1261 [00:37<02:49,  6.11it/s]








 18%|█▊        | 227/1261 [00:37<02:50,  6.06it/s]








 18%|█▊        | 228/1261 [00:37<02:51,  6.04it/s]








 18%|█▊        | 229/1261 [00:37<02:50,  6.04it/s]








 18%|█▊        | 230/1261 [00:37<02:55,  5.87it/s]








 18%|█▊        | 231/1261 [00:38<02:51,  6.00it/s]








 18%|█▊        | 232/1261 [00:38<02:51,  6.01it/s]








 18%|█▊        | 233/1261 [00:38<02:46,  6.19it/s]








 19%|█▊        | 234/1261 [00:38<02:42,  6.32it/s]








 19%|█▊        | 235/1261 [00:38<02:40,  6.41it/s]








 19%|█▊        | 236/1261 [00:38<02:43,  6.28it/s]








 19%|█▉        | 237/1261 [00:39<02:46,  6.14it/s]








 19%|█▉        | 238/1261 [00:39<02:46,  6.16it/s]








 19%|█▉        | 239/1261 [00:39<02:42,  6.31it/s]








 19%|█▉        | 240/1261 [00:39<02:42,  6.28it/s]








 19%|█▉        | 241/1261 [00:39<02:38,  6.44it/s]








 19%|█▉        | 242/1261 [00:39<02:35,  6.53it/s]








 19%|█▉        | 243/1261 [00:39<02:40,  6.35it/s]








 19%|█▉        | 244/1261 [00:40<02:43,  6.23it/s]








 19%|█▉        | 245/1261 [00:40<02:40,  6.31it/s]








 20%|█▉        | 246/1261 [00:40<02:37,  6.46it/s]








 20%|█▉        | 247/1261 [00:40<02:34,  6.55it/s]








 20%|█▉        | 248/1261 [00:40<02:36,  6.47it/s]








 20%|█▉        | 249/1261 [00:40<02:36,  6.46it/s]








 20%|█▉        | 250/1261 [00:41<02:35,  6.52it/s]








 20%|█▉        | 251/1261 [00:41<02:33,  6.57it/s]








 20%|█▉        | 252/1261 [00:41<02:36,  6.43it/s]








 20%|██        | 253/1261 [00:41<02:35,  6.50it/s]








 20%|██        | 254/1261 [00:41<02:34,  6.53it/s]








 20%|██        | 255/1261 [00:41<02:32,  6.61it/s]








 20%|██        | 256/1261 [00:41<02:35,  6.47it/s]








 20%|██        | 257/1261 [00:42<02:34,  6.50it/s]








 20%|██        | 258/1261 [00:42<02:34,  6.51it/s]








 21%|██        | 259/1261 [00:42<02:33,  6.51it/s]








 21%|██        | 260/1261 [00:42<02:36,  6.38it/s]








 21%|██        | 261/1261 [00:42<02:35,  6.45it/s]








 21%|██        | 262/1261 [00:42<02:35,  6.44it/s]








 21%|██        | 263/1261 [00:43<02:32,  6.56it/s]








 21%|██        | 264/1261 [00:43<02:33,  6.48it/s]








 21%|██        | 265/1261 [00:43<02:31,  6.59it/s]








 21%|██        | 266/1261 [00:43<02:31,  6.58it/s]








 21%|██        | 267/1261 [00:43<02:30,  6.61it/s]








 21%|██▏       | 268/1261 [00:43<02:33,  6.45it/s]








 21%|██▏       | 269/1261 [00:43<02:32,  6.51it/s]








 21%|██▏       | 270/1261 [00:44<02:32,  6.50it/s]








 21%|██▏       | 271/1261 [00:44<02:31,  6.53it/s]








 22%|██▏       | 272/1261 [00:44<02:35,  6.38it/s]








 22%|██▏       | 273/1261 [00:44<02:32,  6.49it/s]








 22%|██▏       | 274/1261 [00:44<02:30,  6.55it/s]








 22%|██▏       | 275/1261 [00:44<02:28,  6.62it/s]








 22%|██▏       | 276/1261 [00:45<02:30,  6.55it/s]








 22%|██▏       | 277/1261 [00:45<02:28,  6.62it/s]








 22%|██▏       | 278/1261 [00:45<02:27,  6.66it/s]








 22%|██▏       | 279/1261 [00:45<02:27,  6.68it/s]








 22%|██▏       | 280/1261 [00:45<02:29,  6.55it/s]








 22%|██▏       | 281/1261 [00:45<02:29,  6.54it/s]








 22%|██▏       | 282/1261 [00:45<02:29,  6.54it/s]








 22%|██▏       | 283/1261 [00:46<02:28,  6.57it/s]








 23%|██▎       | 284/1261 [00:46<02:32,  6.42it/s]








 23%|██▎       | 285/1261 [00:46<02:30,  6.49it/s]








 23%|██▎       | 286/1261 [00:46<02:29,  6.53it/s]








 23%|██▎       | 287/1261 [00:46<02:28,  6.56it/s]








 23%|██▎       | 288/1261 [00:46<02:29,  6.52it/s]








 23%|██▎       | 289/1261 [00:47<02:27,  6.59it/s]








 23%|██▎       | 290/1261 [00:47<02:27,  6.58it/s]








 23%|██▎       | 291/1261 [00:47<02:27,  6.60it/s]








 23%|██▎       | 292/1261 [00:47<02:28,  6.51it/s]








 23%|██▎       | 293/1261 [00:47<02:36,  6.19it/s]








 23%|██▎       | 294/1261 [00:47<02:33,  6.31it/s]








 23%|██▎       | 295/1261 [00:47<02:30,  6.43it/s]








 23%|██▎       | 296/1261 [00:48<02:28,  6.48it/s]








 24%|██▎       | 297/1261 [00:48<02:26,  6.58it/s]








 24%|██▎       | 298/1261 [00:48<02:28,  6.46it/s]








 24%|██▎       | 299/1261 [00:48<02:25,  6.59it/s]








 24%|██▍       | 300/1261 [00:48<02:24,  6.64it/s]








 24%|██▍       | 301/1261 [00:48<02:22,  6.71it/s]








 24%|██▍       | 302/1261 [00:49<02:25,  6.59it/s]








 24%|██▍       | 303/1261 [00:49<02:24,  6.64it/s]








 24%|██▍       | 304/1261 [00:49<02:23,  6.69it/s]








 24%|██▍       | 305/1261 [00:49<02:23,  6.67it/s]








 24%|██▍       | 306/1261 [00:49<02:26,  6.52it/s]








 24%|██▍       | 307/1261 [00:49<02:24,  6.60it/s]








 24%|██▍       | 308/1261 [00:49<02:23,  6.63it/s]








 25%|██▍       | 309/1261 [00:50<02:22,  6.69it/s]








 25%|██▍       | 310/1261 [00:50<02:24,  6.59it/s]








 25%|██▍       | 311/1261 [00:50<02:23,  6.62it/s]








 25%|██▍       | 312/1261 [00:50<02:23,  6.59it/s]








 25%|██▍       | 313/1261 [00:50<02:26,  6.48it/s]








 25%|██▍       | 314/1261 [00:50<02:27,  6.41it/s]








 25%|██▍       | 315/1261 [00:50<02:25,  6.51it/s]








 25%|██▌       | 316/1261 [00:51<02:23,  6.57it/s]








 25%|██▌       | 317/1261 [00:51<02:22,  6.63it/s]








 25%|██▌       | 318/1261 [00:51<02:23,  6.58it/s]








 25%|██▌       | 319/1261 [00:51<02:22,  6.61it/s]








 25%|██▌       | 320/1261 [00:51<02:21,  6.66it/s]








 25%|██▌       | 321/1261 [00:51<02:19,  6.74it/s]








 26%|██▌       | 322/1261 [00:52<02:21,  6.65it/s]








 26%|██▌       | 323/1261 [00:52<02:19,  6.72it/s]








 26%|██▌       | 324/1261 [00:52<02:17,  6.81it/s]








 26%|██▌       | 325/1261 [00:52<02:18,  6.77it/s]








 26%|██▌       | 326/1261 [00:52<02:23,  6.52it/s]








 26%|██▌       | 327/1261 [00:52<02:22,  6.56it/s]








 26%|██▌       | 328/1261 [00:52<02:21,  6.60it/s]








 26%|██▌       | 329/1261 [00:53<02:20,  6.64it/s]








 26%|██▌       | 330/1261 [00:53<02:23,  6.49it/s]








 26%|██▌       | 331/1261 [00:53<02:22,  6.54it/s]








 26%|██▋       | 332/1261 [00:53<02:21,  6.59it/s]








 26%|██▋       | 333/1261 [00:53<02:20,  6.63it/s]








 26%|██▋       | 334/1261 [00:53<02:23,  6.46it/s]








 27%|██▋       | 335/1261 [00:54<02:22,  6.51it/s]








 27%|██▋       | 336/1261 [00:54<02:19,  6.63it/s]








 27%|██▋       | 337/1261 [00:54<02:18,  6.67it/s]








 27%|██▋       | 338/1261 [00:54<02:22,  6.50it/s]








 27%|██▋       | 339/1261 [00:54<02:20,  6.55it/s]








 27%|██▋       | 340/1261 [00:54<02:19,  6.60it/s]








 27%|██▋       | 341/1261 [00:54<02:19,  6.61it/s]








 27%|██▋       | 342/1261 [00:55<02:22,  6.43it/s]








 27%|██▋       | 343/1261 [00:55<02:20,  6.52it/s]








 27%|██▋       | 344/1261 [00:55<02:18,  6.62it/s]








 27%|██▋       | 345/1261 [00:55<02:18,  6.62it/s]








 27%|██▋       | 346/1261 [00:55<02:19,  6.57it/s]








 28%|██▊       | 347/1261 [00:55<02:17,  6.65it/s]








 28%|██▊       | 348/1261 [00:55<02:16,  6.69it/s]








 28%|██▊       | 349/1261 [00:56<02:15,  6.71it/s]








 28%|██▊       | 350/1261 [00:56<02:18,  6.59it/s]








 28%|██▊       | 351/1261 [00:56<02:16,  6.65it/s]








 28%|██▊       | 352/1261 [00:56<02:16,  6.64it/s]








 28%|██▊       | 353/1261 [00:56<02:16,  6.64it/s]








 28%|██▊       | 354/1261 [00:56<02:20,  6.45it/s]








 28%|██▊       | 355/1261 [00:57<02:18,  6.53it/s]








 28%|██▊       | 356/1261 [00:57<02:17,  6.59it/s]








 28%|██▊       | 357/1261 [00:57<02:15,  6.65it/s]








 28%|██▊       | 358/1261 [00:57<02:18,  6.50it/s]








 28%|██▊       | 359/1261 [00:57<02:17,  6.57it/s]








 29%|██▊       | 360/1261 [00:57<02:17,  6.57it/s]








 29%|██▊       | 361/1261 [00:57<02:16,  6.60it/s]








 29%|██▊       | 362/1261 [00:58<02:19,  6.43it/s]








 29%|██▉       | 363/1261 [00:58<02:18,  6.50it/s]








 29%|██▉       | 364/1261 [00:58<02:17,  6.54it/s]








 29%|██▉       | 365/1261 [00:58<02:16,  6.55it/s]








 29%|██▉       | 366/1261 [00:58<02:19,  6.42it/s]








 29%|██▉       | 367/1261 [00:58<02:18,  6.46it/s]








 29%|██▉       | 368/1261 [00:59<02:16,  6.56it/s]








 29%|██▉       | 369/1261 [00:59<02:16,  6.53it/s]








 29%|██▉       | 370/1261 [00:59<02:17,  6.48it/s]








 29%|██▉       | 371/1261 [00:59<02:15,  6.58it/s]








 30%|██▉       | 372/1261 [00:59<02:14,  6.61it/s]








 30%|██▉       | 373/1261 [00:59<02:14,  6.62it/s]








 30%|██▉       | 374/1261 [00:59<02:16,  6.52it/s]








 30%|██▉       | 375/1261 [01:00<02:15,  6.52it/s]








 30%|██▉       | 376/1261 [01:00<02:14,  6.59it/s]








 30%|██▉       | 377/1261 [01:00<02:13,  6.63it/s]








 30%|██▉       | 378/1261 [01:00<02:16,  6.47it/s]








 30%|███       | 379/1261 [01:00<02:16,  6.48it/s]








 30%|███       | 380/1261 [01:00<02:15,  6.52it/s]








 30%|███       | 381/1261 [01:01<02:13,  6.59it/s]








 30%|███       | 382/1261 [01:01<02:17,  6.39it/s]








 30%|███       | 383/1261 [01:01<02:15,  6.47it/s]








 30%|███       | 384/1261 [01:01<02:13,  6.57it/s]








 31%|███       | 385/1261 [01:01<02:11,  6.65it/s]








 31%|███       | 386/1261 [01:01<02:15,  6.45it/s]








 31%|███       | 387/1261 [01:01<02:14,  6.52it/s]








 31%|███       | 388/1261 [01:02<02:11,  6.63it/s]








 31%|███       | 389/1261 [01:02<02:11,  6.61it/s]








 31%|███       | 390/1261 [01:02<02:13,  6.52it/s]








 31%|███       | 391/1261 [01:02<02:12,  6.56it/s]








 31%|███       | 392/1261 [01:02<02:12,  6.54it/s]








 31%|███       | 393/1261 [01:02<02:10,  6.63it/s]








 31%|███       | 394/1261 [01:03<02:14,  6.45it/s]








 31%|███▏      | 395/1261 [01:03<02:13,  6.48it/s]








 31%|███▏      | 396/1261 [01:03<02:11,  6.56it/s]








 31%|███▏      | 397/1261 [01:03<02:09,  6.67it/s]








 32%|███▏      | 398/1261 [01:03<02:11,  6.55it/s]








 32%|███▏      | 399/1261 [01:03<02:10,  6.61it/s]








 32%|███▏      | 400/1261 [01:03<02:08,  6.68it/s]








 32%|███▏      | 401/1261 [01:04<02:07,  6.74it/s]








 32%|███▏      | 402/1261 [01:04<02:09,  6.62it/s]








 32%|███▏      | 403/1261 [01:04<02:08,  6.68it/s]








 32%|███▏      | 404/1261 [01:04<02:07,  6.72it/s]








 32%|███▏      | 405/1261 [01:04<02:07,  6.71it/s]








 32%|███▏      | 406/1261 [01:04<02:11,  6.52it/s]








 32%|███▏      | 407/1261 [01:04<02:09,  6.57it/s]








 32%|███▏      | 408/1261 [01:05<02:09,  6.58it/s]








 32%|███▏      | 409/1261 [01:05<02:08,  6.64it/s]








 33%|███▎      | 410/1261 [01:05<02:10,  6.51it/s]








 33%|███▎      | 411/1261 [01:05<02:09,  6.59it/s]








 33%|███▎      | 412/1261 [01:05<02:07,  6.66it/s]








 33%|███▎      | 413/1261 [01:05<02:06,  6.72it/s]








 33%|███▎      | 414/1261 [01:06<02:09,  6.56it/s]








 33%|███▎      | 415/1261 [01:06<02:08,  6.57it/s]








 33%|███▎      | 416/1261 [01:06<02:08,  6.59it/s]








 33%|███▎      | 417/1261 [01:06<02:06,  6.68it/s]








 33%|███▎      | 418/1261 [01:06<02:08,  6.55it/s]








 33%|███▎      | 419/1261 [01:06<02:07,  6.63it/s]








 33%|███▎      | 420/1261 [01:06<02:04,  6.73it/s]








 33%|███▎      | 421/1261 [01:07<02:05,  6.69it/s]








 33%|███▎      | 422/1261 [01:07<02:08,  6.52it/s]








 34%|███▎      | 423/1261 [01:07<02:07,  6.59it/s]








 34%|███▎      | 424/1261 [01:07<02:05,  6.66it/s]








 34%|███▎      | 425/1261 [01:07<02:05,  6.67it/s]








 34%|███▍      | 426/1261 [01:07<02:07,  6.55it/s]








 34%|███▍      | 427/1261 [01:07<02:06,  6.59it/s]








 34%|███▍      | 428/1261 [01:08<02:05,  6.66it/s]








 34%|███▍      | 429/1261 [01:08<02:04,  6.69it/s]








 34%|███▍      | 430/1261 [01:08<02:07,  6.54it/s]








 34%|███▍      | 431/1261 [01:08<02:05,  6.59it/s]








 34%|███▍      | 432/1261 [01:08<02:04,  6.67it/s]








 34%|███▍      | 433/1261 [01:08<02:03,  6.70it/s]








 34%|███▍      | 434/1261 [01:09<02:04,  6.62it/s]








 34%|███▍      | 435/1261 [01:09<02:04,  6.64it/s]








 35%|███▍      | 436/1261 [01:09<02:03,  6.69it/s]








 35%|███▍      | 437/1261 [01:09<02:03,  6.67it/s]








 35%|███▍      | 438/1261 [01:09<02:06,  6.53it/s]








 35%|███▍      | 439/1261 [01:09<02:05,  6.57it/s]








 35%|███▍      | 440/1261 [01:09<02:03,  6.65it/s]








 35%|███▍      | 441/1261 [01:10<02:03,  6.64it/s]








 35%|███▌      | 442/1261 [01:10<02:06,  6.46it/s]








 35%|███▌      | 443/1261 [01:10<02:05,  6.51it/s]








 35%|███▌      | 444/1261 [01:10<02:03,  6.59it/s]








 35%|███▌      | 445/1261 [01:10<02:03,  6.62it/s]








 35%|███▌      | 446/1261 [01:10<02:08,  6.36it/s]








 35%|███▌      | 447/1261 [01:11<02:06,  6.46it/s]








 36%|███▌      | 448/1261 [01:11<02:04,  6.54it/s]








 36%|███▌      | 449/1261 [01:11<02:02,  6.62it/s]








 36%|███▌      | 450/1261 [01:11<02:05,  6.47it/s]








 36%|███▌      | 451/1261 [01:11<02:04,  6.52it/s]








 36%|███▌      | 452/1261 [01:11<02:02,  6.58it/s]








 36%|███▌      | 453/1261 [01:11<02:02,  6.61it/s]








 36%|███▌      | 454/1261 [01:12<02:04,  6.47it/s]








 36%|███▌      | 455/1261 [01:12<02:04,  6.49it/s]








 36%|███▌      | 456/1261 [01:12<02:02,  6.55it/s]








 36%|███▌      | 457/1261 [01:12<02:01,  6.61it/s]








 36%|███▋      | 458/1261 [01:12<02:03,  6.48it/s]








 36%|███▋      | 459/1261 [01:12<02:02,  6.55it/s]








 36%|███▋      | 460/1261 [01:13<02:01,  6.61it/s]








 37%|███▋      | 461/1261 [01:13<02:01,  6.61it/s]








 37%|███▋      | 462/1261 [01:13<02:03,  6.45it/s]








 37%|███▋      | 463/1261 [01:13<02:02,  6.50it/s]








 37%|███▋      | 464/1261 [01:13<02:01,  6.55it/s]








 37%|███▋      | 465/1261 [01:13<02:00,  6.60it/s]








 37%|███▋      | 466/1261 [01:13<02:03,  6.45it/s]








 37%|███▋      | 467/1261 [01:14<02:01,  6.51it/s]








 37%|███▋      | 468/1261 [01:14<02:00,  6.58it/s]








 37%|███▋      | 469/1261 [01:14<01:58,  6.67it/s]








 37%|███▋      | 470/1261 [01:14<02:00,  6.54it/s]








 37%|███▋      | 471/1261 [01:14<01:59,  6.60it/s]








 37%|███▋      | 472/1261 [01:14<01:59,  6.62it/s]








 38%|███▊      | 473/1261 [01:14<01:58,  6.65it/s]








 38%|███▊      | 474/1261 [01:15<02:01,  6.47it/s]








 38%|███▊      | 475/1261 [01:15<02:00,  6.52it/s]








 38%|███▊      | 476/1261 [01:15<01:59,  6.55it/s]








 38%|███▊      | 477/1261 [01:15<01:59,  6.55it/s]








 38%|███▊      | 478/1261 [01:15<02:00,  6.50it/s]








 38%|███▊      | 479/1261 [01:15<01:59,  6.57it/s]








 38%|███▊      | 480/1261 [01:16<01:57,  6.65it/s]








 38%|███▊      | 481/1261 [01:16<01:57,  6.66it/s]








 38%|███▊      | 482/1261 [01:16<01:58,  6.56it/s]








 38%|███▊      | 483/1261 [01:16<01:57,  6.63it/s]








 38%|███▊      | 484/1261 [01:16<01:56,  6.70it/s]








 38%|███▊      | 485/1261 [01:16<01:55,  6.70it/s]








 39%|███▊      | 486/1261 [01:16<01:57,  6.62it/s]








 39%|███▊      | 487/1261 [01:17<01:56,  6.63it/s]








 39%|███▊      | 488/1261 [01:17<01:55,  6.67it/s]








 39%|███▉      | 489/1261 [01:17<01:54,  6.73it/s]








 39%|███▉      | 490/1261 [01:17<01:57,  6.58it/s]








 39%|███▉      | 491/1261 [01:17<01:57,  6.57it/s]








 39%|███▉      | 492/1261 [01:17<01:56,  6.61it/s]








 39%|███▉      | 493/1261 [01:18<01:55,  6.64it/s]








 39%|███▉      | 494/1261 [01:18<01:58,  6.50it/s]








 39%|███▉      | 495/1261 [01:18<01:56,  6.57it/s]








 39%|███▉      | 496/1261 [01:18<01:55,  6.63it/s]








 39%|███▉      | 497/1261 [01:18<01:54,  6.65it/s]








 39%|███▉      | 498/1261 [01:18<01:55,  6.62it/s]








 40%|███▉      | 499/1261 [01:18<01:54,  6.68it/s]








 40%|███▉      | 500/1261 [01:19<01:52,  6.75it/s]








 40%|███▉      | 501/1261 [01:19<01:52,  6.78it/s]








 40%|███▉      | 502/1261 [01:19<01:53,  6.66it/s]








 40%|███▉      | 503/1261 [01:19<01:53,  6.67it/s]








 40%|███▉      | 504/1261 [01:19<01:53,  6.68it/s]








 40%|████      | 505/1261 [01:19<01:53,  6.68it/s]








 40%|████      | 506/1261 [01:19<01:57,  6.43it/s]








 40%|████      | 507/1261 [01:20<01:55,  6.51it/s]








 40%|████      | 508/1261 [01:20<01:54,  6.59it/s]








 40%|████      | 509/1261 [01:20<01:52,  6.69it/s]








 40%|████      | 510/1261 [01:20<01:56,  6.44it/s]








 41%|████      | 511/1261 [01:20<01:58,  6.33it/s]








 41%|████      | 512/1261 [01:20<01:55,  6.48it/s]








 41%|████      | 513/1261 [01:21<01:52,  6.62it/s]








 41%|████      | 514/1261 [01:21<01:53,  6.57it/s]








 41%|████      | 515/1261 [01:21<01:52,  6.63it/s]








 41%|████      | 516/1261 [01:21<01:51,  6.67it/s]








 41%|████      | 517/1261 [01:21<01:51,  6.70it/s]








 41%|████      | 518/1261 [01:21<01:54,  6.50it/s]








 41%|████      | 519/1261 [01:21<01:53,  6.55it/s]








 41%|████      | 520/1261 [01:22<01:51,  6.63it/s]








 41%|████▏     | 521/1261 [01:22<01:50,  6.70it/s]








 41%|████▏     | 522/1261 [01:22<01:53,  6.52it/s]








 41%|████▏     | 523/1261 [01:22<01:52,  6.54it/s]








 42%|████▏     | 524/1261 [01:22<01:52,  6.57it/s]








 42%|████▏     | 525/1261 [01:22<01:52,  6.57it/s]








 42%|████▏     | 526/1261 [01:23<01:55,  6.39it/s]








 42%|████▏     | 527/1261 [01:23<01:53,  6.46it/s]








 42%|████▏     | 528/1261 [01:23<01:52,  6.51it/s]








 42%|████▏     | 529/1261 [01:23<01:52,  6.53it/s]








 42%|████▏     | 530/1261 [01:23<01:54,  6.40it/s]








 42%|████▏     | 531/1261 [01:23<01:52,  6.48it/s]








 42%|████▏     | 532/1261 [01:23<01:51,  6.56it/s]








 42%|████▏     | 533/1261 [01:24<01:50,  6.60it/s]








 42%|████▏     | 534/1261 [01:24<01:51,  6.53it/s]








 42%|████▏     | 535/1261 [01:24<01:50,  6.57it/s]








 43%|████▎     | 536/1261 [01:24<01:49,  6.60it/s]








 43%|████▎     | 537/1261 [01:24<01:49,  6.61it/s]








 43%|████▎     | 538/1261 [01:24<01:53,  6.38it/s]








 43%|████▎     | 539/1261 [01:25<01:52,  6.43it/s]








 43%|████▎     | 540/1261 [01:25<01:52,  6.41it/s]








 43%|████▎     | 541/1261 [01:25<01:51,  6.43it/s]








 43%|████▎     | 542/1261 [01:25<01:54,  6.27it/s]








 43%|████▎     | 543/1261 [01:25<01:57,  6.12it/s]








 43%|████▎     | 544/1261 [01:25<01:57,  6.08it/s]








 43%|████▎     | 545/1261 [01:26<01:54,  6.24it/s]








 43%|████▎     | 546/1261 [01:26<01:52,  6.33it/s]








 43%|████▎     | 547/1261 [01:26<01:50,  6.47it/s]








 43%|████▎     | 548/1261 [01:26<01:50,  6.44it/s]








 44%|████▎     | 549/1261 [01:26<01:49,  6.49it/s]








 44%|████▎     | 550/1261 [01:26<01:48,  6.55it/s]








 44%|████▎     | 551/1261 [01:26<01:48,  6.53it/s]








 44%|████▍     | 552/1261 [01:27<01:51,  6.38it/s]








 44%|████▍     | 553/1261 [01:27<01:50,  6.40it/s]








 44%|████▍     | 554/1261 [01:27<01:50,  6.41it/s]








 44%|████▍     | 555/1261 [01:27<01:48,  6.49it/s]








 44%|████▍     | 556/1261 [01:27<01:49,  6.42it/s]








 44%|████▍     | 557/1261 [01:27<01:48,  6.46it/s]








 44%|████▍     | 558/1261 [01:28<01:48,  6.50it/s]








 44%|████▍     | 559/1261 [01:28<01:48,  6.47it/s]








 44%|████▍     | 560/1261 [01:28<01:51,  6.30it/s]








 44%|████▍     | 561/1261 [01:28<01:49,  6.40it/s]








 45%|████▍     | 562/1261 [01:28<01:47,  6.49it/s]








 45%|████▍     | 563/1261 [01:28<01:47,  6.52it/s]








 45%|████▍     | 564/1261 [01:28<01:48,  6.42it/s]








 45%|████▍     | 565/1261 [01:29<01:47,  6.46it/s]








 45%|████▍     | 566/1261 [01:29<01:46,  6.52it/s]








 45%|████▍     | 567/1261 [01:29<01:46,  6.55it/s]








 45%|████▌     | 568/1261 [01:29<01:47,  6.42it/s]








 45%|████▌     | 569/1261 [01:29<01:47,  6.41it/s]








 45%|████▌     | 570/1261 [01:29<01:47,  6.42it/s]








 45%|████▌     | 571/1261 [01:30<01:45,  6.51it/s]








 45%|████▌     | 572/1261 [01:30<01:48,  6.35it/s]








 45%|████▌     | 573/1261 [01:30<01:46,  6.45it/s]








 46%|████▌     | 574/1261 [01:30<01:45,  6.53it/s]








 46%|████▌     | 575/1261 [01:30<01:44,  6.59it/s]








 46%|████▌     | 576/1261 [01:30<01:46,  6.44it/s]








 46%|████▌     | 577/1261 [01:30<01:44,  6.53it/s]








 46%|████▌     | 578/1261 [01:31<01:43,  6.61it/s]








 46%|████▌     | 579/1261 [01:31<01:43,  6.61it/s]








 46%|████▌     | 580/1261 [01:31<01:45,  6.47it/s]








 46%|████▌     | 581/1261 [01:31<01:43,  6.54it/s]








 46%|████▌     | 582/1261 [01:31<01:43,  6.59it/s]








 46%|████▌     | 583/1261 [01:31<01:41,  6.67it/s]








 46%|████▋     | 584/1261 [01:32<01:44,  6.51it/s]








 46%|████▋     | 585/1261 [01:32<01:43,  6.53it/s]








 46%|████▋     | 586/1261 [01:32<01:42,  6.58it/s]








 47%|████▋     | 587/1261 [01:32<01:41,  6.62it/s]








 47%|████▋     | 588/1261 [01:32<01:44,  6.46it/s]








 47%|████▋     | 589/1261 [01:32<01:43,  6.51it/s]








 47%|████▋     | 590/1261 [01:32<01:42,  6.57it/s]








 47%|████▋     | 591/1261 [01:33<01:41,  6.62it/s]








 47%|████▋     | 592/1261 [01:33<01:44,  6.41it/s]








 47%|████▋     | 593/1261 [01:33<01:43,  6.43it/s]








 47%|████▋     | 594/1261 [01:33<01:42,  6.52it/s]








 47%|████▋     | 595/1261 [01:33<01:40,  6.59it/s]








 47%|████▋     | 596/1261 [01:33<01:43,  6.42it/s]








 47%|████▋     | 597/1261 [01:34<01:42,  6.51it/s]








 47%|████▋     | 598/1261 [01:34<01:40,  6.57it/s]








 48%|████▊     | 599/1261 [01:34<01:40,  6.60it/s]








 48%|████▊     | 600/1261 [01:34<01:42,  6.44it/s]








 48%|████▊     | 601/1261 [01:34<01:41,  6.48it/s]








 48%|████▊     | 602/1261 [01:34<01:40,  6.54it/s]








 48%|████▊     | 603/1261 [01:34<01:39,  6.63it/s]








 48%|████▊     | 604/1261 [01:35<01:42,  6.41it/s]








 48%|████▊     | 605/1261 [01:35<01:41,  6.46it/s]








 48%|████▊     | 606/1261 [01:35<01:40,  6.55it/s]








 48%|████▊     | 607/1261 [01:35<01:39,  6.59it/s]








 48%|████▊     | 608/1261 [01:35<01:42,  6.38it/s]








 48%|████▊     | 609/1261 [01:35<01:40,  6.48it/s]








 48%|████▊     | 610/1261 [01:36<01:40,  6.47it/s]








 48%|████▊     | 611/1261 [01:36<01:39,  6.52it/s]








 49%|████▊     | 612/1261 [01:36<01:43,  6.27it/s]








 49%|████▊     | 613/1261 [01:36<01:41,  6.37it/s]








 49%|████▊     | 614/1261 [01:36<01:40,  6.43it/s]








 49%|████▉     | 615/1261 [01:36<01:38,  6.54it/s]








 49%|████▉     | 616/1261 [01:36<01:39,  6.47it/s]








 49%|████▉     | 617/1261 [01:37<01:39,  6.48it/s]








 49%|████▉     | 618/1261 [01:37<01:37,  6.57it/s]








 49%|████▉     | 619/1261 [01:37<01:38,  6.53it/s]








 49%|████▉     | 620/1261 [01:37<01:40,  6.39it/s]








 49%|████▉     | 621/1261 [01:37<01:38,  6.47it/s]








 49%|████▉     | 622/1261 [01:37<01:38,  6.47it/s]








 49%|████▉     | 623/1261 [01:38<01:37,  6.52it/s]








 49%|████▉     | 624/1261 [01:38<01:40,  6.36it/s]








 50%|████▉     | 625/1261 [01:38<01:38,  6.43it/s]








 50%|████▉     | 626/1261 [01:38<01:37,  6.49it/s]








 50%|████▉     | 627/1261 [01:38<01:35,  6.62it/s]








 50%|████▉     | 628/1261 [01:38<01:37,  6.46it/s]








 50%|████▉     | 629/1261 [01:38<01:37,  6.50it/s]








 50%|████▉     | 630/1261 [01:39<01:36,  6.54it/s]








 50%|█████     | 631/1261 [01:39<01:35,  6.58it/s]








 50%|█████     | 632/1261 [01:39<01:38,  6.40it/s]








 50%|█████     | 633/1261 [01:39<01:37,  6.43it/s]








 50%|█████     | 634/1261 [01:39<01:36,  6.51it/s]








 50%|█████     | 635/1261 [01:39<01:35,  6.58it/s]








 50%|█████     | 636/1261 [01:40<01:37,  6.42it/s]








 51%|█████     | 637/1261 [01:40<01:36,  6.47it/s]








 51%|█████     | 638/1261 [01:40<01:35,  6.54it/s]








 51%|█████     | 639/1261 [01:40<01:33,  6.62it/s]








 51%|█████     | 640/1261 [01:40<01:35,  6.51it/s]








 51%|█████     | 641/1261 [01:40<01:34,  6.53it/s]








 51%|█████     | 642/1261 [01:40<01:34,  6.55it/s]








 51%|█████     | 643/1261 [01:41<01:33,  6.60it/s]








 51%|█████     | 644/1261 [01:41<01:35,  6.46it/s]








 51%|█████     | 645/1261 [01:41<01:35,  6.47it/s]








 51%|█████     | 646/1261 [01:41<01:34,  6.53it/s]








 51%|█████▏    | 647/1261 [01:41<01:32,  6.62it/s]








 51%|█████▏    | 648/1261 [01:41<01:34,  6.51it/s]








 51%|█████▏    | 649/1261 [01:42<01:33,  6.54it/s]








 52%|█████▏    | 650/1261 [01:42<01:33,  6.53it/s]








 52%|█████▏    | 651/1261 [01:42<01:33,  6.55it/s]








 52%|█████▏    | 652/1261 [01:42<01:36,  6.33it/s]








 52%|█████▏    | 653/1261 [01:42<01:35,  6.38it/s]








 52%|█████▏    | 654/1261 [01:42<01:34,  6.44it/s]








 52%|█████▏    | 655/1261 [01:42<01:32,  6.53it/s]








 52%|█████▏    | 656/1261 [01:43<01:36,  6.29it/s]








 52%|█████▏    | 657/1261 [01:43<01:34,  6.39it/s]








 52%|█████▏    | 658/1261 [01:43<01:32,  6.50it/s]








 52%|█████▏    | 659/1261 [01:43<01:31,  6.58it/s]








 52%|█████▏    | 660/1261 [01:43<01:32,  6.48it/s]








 52%|█████▏    | 661/1261 [01:43<01:32,  6.51it/s]








 52%|█████▏    | 662/1261 [01:44<01:31,  6.54it/s]








 53%|█████▎    | 663/1261 [01:44<01:30,  6.58it/s]








 53%|█████▎    | 664/1261 [01:44<01:33,  6.39it/s]








 53%|█████▎    | 665/1261 [01:44<01:33,  6.40it/s]








 53%|█████▎    | 666/1261 [01:44<01:31,  6.47it/s]








 53%|█████▎    | 667/1261 [01:44<01:31,  6.48it/s]








 53%|█████▎    | 668/1261 [01:44<01:33,  6.35it/s]








 53%|█████▎    | 669/1261 [01:45<01:31,  6.44it/s]








 53%|█████▎    | 670/1261 [01:45<01:30,  6.53it/s]








 53%|█████▎    | 671/1261 [01:45<01:29,  6.58it/s]








 53%|█████▎    | 672/1261 [01:45<01:31,  6.41it/s]








 53%|█████▎    | 673/1261 [01:45<01:30,  6.49it/s]








 53%|█████▎    | 674/1261 [01:45<01:29,  6.57it/s]








 54%|█████▎    | 675/1261 [01:46<01:28,  6.64it/s]








 54%|█████▎    | 676/1261 [01:46<01:28,  6.61it/s]








 54%|█████▎    | 677/1261 [01:46<01:27,  6.64it/s]








 54%|█████▍    | 678/1261 [01:46<01:27,  6.63it/s]








 54%|█████▍    | 679/1261 [01:46<01:27,  6.69it/s]








 54%|█████▍    | 680/1261 [01:46<01:27,  6.61it/s]








 54%|█████▍    | 681/1261 [01:46<01:28,  6.58it/s]








 54%|█████▍    | 682/1261 [01:47<01:27,  6.58it/s]








 54%|█████▍    | 683/1261 [01:47<01:27,  6.63it/s]








 54%|█████▍    | 684/1261 [01:47<01:28,  6.49it/s]








 54%|█████▍    | 685/1261 [01:47<01:28,  6.53it/s]








 54%|█████▍    | 686/1261 [01:47<01:27,  6.54it/s]








 54%|█████▍    | 687/1261 [01:47<01:27,  6.60it/s]








 55%|█████▍    | 688/1261 [01:48<01:27,  6.52it/s]








 55%|█████▍    | 689/1261 [01:48<01:26,  6.61it/s]








 55%|█████▍    | 690/1261 [01:48<01:25,  6.66it/s]








 55%|█████▍    | 691/1261 [01:48<01:24,  6.72it/s]








 55%|█████▍    | 692/1261 [01:48<01:26,  6.56it/s]








 55%|█████▍    | 693/1261 [01:48<01:25,  6.65it/s]








 55%|█████▌    | 694/1261 [01:48<01:24,  6.68it/s]








 55%|█████▌    | 695/1261 [01:49<01:24,  6.66it/s]








 55%|█████▌    | 696/1261 [01:49<01:26,  6.55it/s]








 55%|█████▌    | 697/1261 [01:49<01:25,  6.63it/s]








 55%|█████▌    | 698/1261 [01:49<01:23,  6.73it/s]








 55%|█████▌    | 699/1261 [01:49<01:23,  6.71it/s]








 56%|█████▌    | 700/1261 [01:49<01:25,  6.54it/s]








 56%|█████▌    | 701/1261 [01:49<01:24,  6.59it/s]








 56%|█████▌    | 702/1261 [01:50<01:24,  6.59it/s]








 56%|█████▌    | 703/1261 [01:50<01:23,  6.67it/s]








 56%|█████▌    | 704/1261 [01:50<01:25,  6.54it/s]








 56%|█████▌    | 705/1261 [01:50<01:24,  6.55it/s]








 56%|█████▌    | 706/1261 [01:50<01:26,  6.45it/s]








 56%|█████▌    | 707/1261 [01:50<01:25,  6.48it/s]








 56%|█████▌    | 708/1261 [01:51<01:27,  6.32it/s]








 56%|█████▌    | 709/1261 [01:51<01:25,  6.42it/s]








 56%|█████▋    | 710/1261 [01:51<01:25,  6.48it/s]








 56%|█████▋    | 711/1261 [01:51<01:23,  6.57it/s]








 56%|█████▋    | 712/1261 [01:51<01:25,  6.45it/s]








 57%|█████▋    | 713/1261 [01:51<01:24,  6.50it/s]








 57%|█████▋    | 714/1261 [01:51<01:23,  6.58it/s]








 57%|█████▋    | 715/1261 [01:52<01:22,  6.65it/s]








 57%|█████▋    | 716/1261 [01:52<01:24,  6.44it/s]








 57%|█████▋    | 717/1261 [01:52<01:23,  6.54it/s]








 57%|█████▋    | 718/1261 [01:52<01:22,  6.60it/s]








 57%|█████▋    | 719/1261 [01:52<01:20,  6.70it/s]








 57%|█████▋    | 720/1261 [01:52<01:22,  6.58it/s]








 57%|█████▋    | 721/1261 [01:53<01:21,  6.60it/s]








 57%|█████▋    | 722/1261 [01:53<01:20,  6.67it/s]








 57%|█████▋    | 723/1261 [01:53<01:20,  6.71it/s]








 57%|█████▋    | 724/1261 [01:53<01:22,  6.52it/s]








 57%|█████▋    | 725/1261 [01:53<01:22,  6.53it/s]








 58%|█████▊    | 726/1261 [01:53<01:22,  6.51it/s]








 58%|█████▊    | 727/1261 [01:53<01:22,  6.50it/s]








 58%|█████▊    | 728/1261 [01:54<01:23,  6.37it/s]








 58%|█████▊    | 729/1261 [01:54<01:22,  6.47it/s]








 58%|█████▊    | 730/1261 [01:54<01:21,  6.53it/s]








 58%|█████▊    | 731/1261 [01:54<01:20,  6.57it/s]








 58%|█████▊    | 732/1261 [01:54<01:22,  6.43it/s]








 58%|█████▊    | 733/1261 [01:54<01:22,  6.43it/s]








 58%|█████▊    | 734/1261 [01:55<01:21,  6.50it/s]








 58%|█████▊    | 735/1261 [01:55<01:19,  6.59it/s]








 58%|█████▊    | 736/1261 [01:55<01:21,  6.44it/s]








 58%|█████▊    | 737/1261 [01:55<01:20,  6.49it/s]








 59%|█████▊    | 738/1261 [01:55<01:20,  6.52it/s]








 59%|█████▊    | 739/1261 [01:55<01:19,  6.58it/s]








 59%|█████▊    | 740/1261 [01:55<01:21,  6.39it/s]








 59%|█████▉    | 741/1261 [01:56<01:19,  6.50it/s]








 59%|█████▉    | 742/1261 [01:56<01:19,  6.57it/s]








 59%|█████▉    | 743/1261 [01:56<01:18,  6.63it/s]








 59%|█████▉    | 744/1261 [01:56<01:20,  6.44it/s]








 59%|█████▉    | 745/1261 [01:56<01:19,  6.45it/s]








 59%|█████▉    | 746/1261 [01:56<01:19,  6.49it/s]








 59%|█████▉    | 747/1261 [01:57<01:18,  6.58it/s]








 59%|█████▉    | 748/1261 [01:57<01:18,  6.50it/s]








 59%|█████▉    | 749/1261 [01:57<01:17,  6.56it/s]








 59%|█████▉    | 750/1261 [01:57<01:17,  6.62it/s]








 60%|█████▉    | 751/1261 [01:57<01:16,  6.65it/s]








 60%|█████▉    | 752/1261 [01:57<01:18,  6.46it/s]








 60%|█████▉    | 753/1261 [01:57<01:18,  6.49it/s]








 60%|█████▉    | 754/1261 [01:58<01:17,  6.51it/s]








 60%|█████▉    | 755/1261 [01:58<01:16,  6.59it/s]








 60%|█████▉    | 756/1261 [01:58<01:17,  6.49it/s]








 60%|██████    | 757/1261 [01:58<01:16,  6.55it/s]








 60%|██████    | 758/1261 [01:58<01:16,  6.55it/s]








 60%|██████    | 759/1261 [01:58<01:16,  6.58it/s]








 60%|██████    | 760/1261 [01:59<01:18,  6.40it/s]








 60%|██████    | 761/1261 [01:59<01:19,  6.33it/s]








 60%|██████    | 762/1261 [01:59<01:17,  6.43it/s]








 61%|██████    | 763/1261 [01:59<01:16,  6.55it/s]








 61%|██████    | 764/1261 [01:59<01:16,  6.50it/s]








 61%|██████    | 765/1261 [01:59<01:16,  6.51it/s]








 61%|██████    | 766/1261 [01:59<01:14,  6.60it/s]








 61%|██████    | 767/1261 [02:00<01:14,  6.64it/s]








 61%|██████    | 768/1261 [02:00<01:15,  6.53it/s]








 61%|██████    | 769/1261 [02:00<01:14,  6.60it/s]








 61%|██████    | 770/1261 [02:00<01:13,  6.67it/s]








 61%|██████    | 771/1261 [02:00<01:12,  6.74it/s]








 61%|██████    | 772/1261 [02:00<01:13,  6.64it/s]








 61%|██████▏   | 773/1261 [02:00<01:13,  6.66it/s]








 61%|██████▏   | 774/1261 [02:01<01:12,  6.70it/s]








 61%|██████▏   | 775/1261 [02:01<01:12,  6.72it/s]








 62%|██████▏   | 776/1261 [02:01<01:15,  6.43it/s]








 62%|██████▏   | 777/1261 [02:01<01:14,  6.50it/s]








 62%|██████▏   | 778/1261 [02:01<01:13,  6.59it/s]








 62%|██████▏   | 779/1261 [02:01<01:12,  6.65it/s]








 62%|██████▏   | 780/1261 [02:02<01:12,  6.61it/s]








 62%|██████▏   | 781/1261 [02:02<01:12,  6.61it/s]








 62%|██████▏   | 782/1261 [02:02<01:11,  6.71it/s]








 62%|██████▏   | 783/1261 [02:02<01:10,  6.80it/s]








 62%|██████▏   | 784/1261 [02:02<01:12,  6.62it/s]








 62%|██████▏   | 785/1261 [02:02<01:11,  6.65it/s]








 62%|██████▏   | 786/1261 [02:02<01:11,  6.65it/s]








 62%|██████▏   | 787/1261 [02:03<01:10,  6.71it/s]








 62%|██████▏   | 788/1261 [02:03<01:13,  6.46it/s]








 63%|██████▎   | 789/1261 [02:03<01:12,  6.54it/s]








 63%|██████▎   | 790/1261 [02:03<01:11,  6.61it/s]








 63%|██████▎   | 791/1261 [02:03<01:10,  6.66it/s]








 63%|██████▎   | 792/1261 [02:03<01:11,  6.56it/s]








 63%|██████▎   | 793/1261 [02:04<01:13,  6.35it/s]








 63%|██████▎   | 794/1261 [02:04<01:12,  6.40it/s]








 63%|██████▎   | 795/1261 [02:04<01:11,  6.48it/s]








 63%|██████▎   | 796/1261 [02:04<01:10,  6.55it/s]








 63%|██████▎   | 797/1261 [02:04<01:10,  6.54it/s]








 63%|██████▎   | 798/1261 [02:04<01:12,  6.37it/s]








 63%|██████▎   | 799/1261 [02:04<01:11,  6.42it/s]








 63%|██████▎   | 800/1261 [02:05<01:11,  6.48it/s]








 64%|██████▎   | 801/1261 [02:05<01:09,  6.58it/s]








 64%|██████▎   | 802/1261 [02:05<01:11,  6.45it/s]








 64%|██████▎   | 803/1261 [02:05<01:10,  6.49it/s]








 64%|██████▍   | 804/1261 [02:05<01:09,  6.53it/s]








 64%|██████▍   | 805/1261 [02:05<01:09,  6.61it/s]








 64%|██████▍   | 806/1261 [02:06<01:11,  6.37it/s]








 64%|██████▍   | 807/1261 [02:06<01:10,  6.47it/s]








 64%|██████▍   | 808/1261 [02:06<01:08,  6.59it/s]








 64%|██████▍   | 809/1261 [02:06<01:08,  6.61it/s]








 64%|██████▍   | 810/1261 [02:06<01:09,  6.45it/s]








 64%|██████▍   | 811/1261 [02:06<01:09,  6.47it/s]








 64%|██████▍   | 812/1261 [02:06<01:08,  6.51it/s]








 64%|██████▍   | 813/1261 [02:07<01:08,  6.56it/s]








 65%|██████▍   | 814/1261 [02:07<01:09,  6.45it/s]








 65%|██████▍   | 815/1261 [02:07<01:08,  6.51it/s]








 65%|██████▍   | 816/1261 [02:07<01:07,  6.60it/s]








 65%|██████▍   | 817/1261 [02:07<01:07,  6.62it/s]








 65%|██████▍   | 818/1261 [02:07<01:07,  6.54it/s]








 65%|██████▍   | 819/1261 [02:08<01:07,  6.59it/s]








 65%|██████▌   | 820/1261 [02:08<01:06,  6.65it/s]








 65%|██████▌   | 821/1261 [02:08<01:05,  6.67it/s]








 65%|██████▌   | 822/1261 [02:08<01:08,  6.45it/s]








 65%|██████▌   | 823/1261 [02:08<01:07,  6.49it/s]








 65%|██████▌   | 824/1261 [02:08<01:06,  6.59it/s]








 65%|██████▌   | 825/1261 [02:08<01:06,  6.60it/s]








 66%|██████▌   | 826/1261 [02:09<01:07,  6.46it/s]








 66%|██████▌   | 827/1261 [02:09<01:06,  6.52it/s]








 66%|██████▌   | 828/1261 [02:09<01:05,  6.60it/s]








 66%|██████▌   | 829/1261 [02:09<01:05,  6.63it/s]








 66%|██████▌   | 830/1261 [02:09<01:05,  6.53it/s]








 66%|██████▌   | 831/1261 [02:09<01:05,  6.55it/s]








 66%|██████▌   | 832/1261 [02:09<01:05,  6.57it/s]








 66%|██████▌   | 833/1261 [02:10<01:04,  6.59it/s]








 66%|██████▌   | 834/1261 [02:10<01:06,  6.42it/s]








 66%|██████▌   | 835/1261 [02:10<01:05,  6.50it/s]








 66%|██████▋   | 836/1261 [02:10<01:05,  6.53it/s]








 66%|██████▋   | 837/1261 [02:10<01:04,  6.58it/s]








 66%|██████▋   | 838/1261 [02:10<01:05,  6.43it/s]








 67%|██████▋   | 839/1261 [02:11<01:05,  6.49it/s]








 67%|██████▋   | 840/1261 [02:11<01:04,  6.49it/s]








 67%|██████▋   | 841/1261 [02:11<01:05,  6.45it/s]








 67%|██████▋   | 842/1261 [02:11<01:05,  6.37it/s]








 67%|██████▋   | 843/1261 [02:11<01:04,  6.49it/s]








 67%|██████▋   | 844/1261 [02:11<01:03,  6.58it/s]








 67%|██████▋   | 845/1261 [02:11<01:02,  6.61it/s]








 67%|██████▋   | 846/1261 [02:12<01:04,  6.42it/s]








 67%|██████▋   | 847/1261 [02:12<01:03,  6.47it/s]








 67%|██████▋   | 848/1261 [02:12<01:03,  6.52it/s]








 67%|██████▋   | 849/1261 [02:12<01:02,  6.58it/s]








 67%|██████▋   | 850/1261 [02:12<01:03,  6.43it/s]








 67%|██████▋   | 851/1261 [02:12<01:03,  6.46it/s]








 68%|██████▊   | 852/1261 [02:13<01:03,  6.48it/s]








 68%|██████▊   | 853/1261 [02:13<01:03,  6.48it/s]








 68%|██████▊   | 854/1261 [02:13<01:05,  6.24it/s]








 68%|██████▊   | 855/1261 [02:13<01:03,  6.36it/s]








 68%|██████▊   | 856/1261 [02:13<01:02,  6.45it/s]








 68%|██████▊   | 857/1261 [02:13<01:01,  6.52it/s]








 68%|██████▊   | 858/1261 [02:14<01:02,  6.48it/s]








 68%|██████▊   | 859/1261 [02:14<01:01,  6.50it/s]








 68%|██████▊   | 860/1261 [02:14<01:01,  6.55it/s]








 68%|██████▊   | 861/1261 [02:14<01:00,  6.61it/s]








 68%|██████▊   | 862/1261 [02:14<01:01,  6.50it/s]








 68%|██████▊   | 863/1261 [02:14<01:00,  6.58it/s]








 69%|██████▊   | 864/1261 [02:14<00:59,  6.64it/s]








 69%|██████▊   | 865/1261 [02:15<00:59,  6.65it/s]








 69%|██████▊   | 866/1261 [02:15<01:00,  6.48it/s]








 69%|██████▉   | 867/1261 [02:15<01:00,  6.54it/s]








 69%|██████▉   | 868/1261 [02:15<00:59,  6.58it/s]








 69%|██████▉   | 869/1261 [02:15<00:59,  6.63it/s]








 69%|██████▉   | 870/1261 [02:15<00:59,  6.53it/s]








 69%|██████▉   | 871/1261 [02:15<00:59,  6.59it/s]








 69%|██████▉   | 872/1261 [02:16<00:58,  6.66it/s]








 69%|██████▉   | 873/1261 [02:16<00:57,  6.70it/s]








 69%|██████▉   | 874/1261 [02:16<00:59,  6.53it/s]








 69%|██████▉   | 875/1261 [02:16<00:58,  6.62it/s]








 69%|██████▉   | 876/1261 [02:16<00:58,  6.62it/s]








 70%|██████▉   | 877/1261 [02:16<00:57,  6.66it/s]








 70%|██████▉   | 878/1261 [02:17<00:59,  6.47it/s]








 70%|██████▉   | 879/1261 [02:17<00:58,  6.51it/s]








 70%|██████▉   | 880/1261 [02:17<00:58,  6.53it/s]








 70%|██████▉   | 881/1261 [02:17<00:57,  6.58it/s]








 70%|██████▉   | 882/1261 [02:17<00:58,  6.52it/s]








 70%|███████   | 883/1261 [02:17<00:57,  6.57it/s]








 70%|███████   | 884/1261 [02:17<00:56,  6.65it/s]








 70%|███████   | 885/1261 [02:18<00:55,  6.76it/s]








 70%|███████   | 886/1261 [02:18<00:56,  6.64it/s]








 70%|███████   | 887/1261 [02:18<00:55,  6.72it/s]








 70%|███████   | 888/1261 [02:18<00:55,  6.75it/s]








 70%|███████   | 889/1261 [02:18<00:55,  6.76it/s]








 71%|███████   | 890/1261 [02:18<00:56,  6.56it/s]








 71%|███████   | 891/1261 [02:18<00:55,  6.62it/s]








 71%|███████   | 892/1261 [02:19<00:55,  6.65it/s]








 71%|███████   | 893/1261 [02:19<00:55,  6.65it/s]








 71%|███████   | 894/1261 [02:19<00:56,  6.49it/s]








 71%|███████   | 895/1261 [02:19<00:56,  6.53it/s]








 71%|███████   | 896/1261 [02:19<00:55,  6.53it/s]








 71%|███████   | 897/1261 [02:19<00:54,  6.63it/s]








 71%|███████   | 898/1261 [02:20<00:56,  6.47it/s]








 71%|███████▏  | 899/1261 [02:20<00:55,  6.47it/s]








 71%|███████▏  | 900/1261 [02:20<00:55,  6.55it/s]








 71%|███████▏  | 901/1261 [02:20<00:54,  6.64it/s]








 72%|███████▏  | 902/1261 [02:20<00:55,  6.43it/s]








 72%|███████▏  | 903/1261 [02:20<00:55,  6.43it/s]








 72%|███████▏  | 904/1261 [02:20<00:54,  6.51it/s]








 72%|███████▏  | 905/1261 [02:21<00:54,  6.59it/s]








 72%|███████▏  | 906/1261 [02:21<00:55,  6.45it/s]








 72%|███████▏  | 907/1261 [02:21<00:54,  6.55it/s]








 72%|███████▏  | 908/1261 [02:21<00:53,  6.63it/s]








 72%|███████▏  | 909/1261 [02:21<00:52,  6.67it/s]








 72%|███████▏  | 910/1261 [02:21<00:53,  6.56it/s]








 72%|███████▏  | 911/1261 [02:22<00:52,  6.67it/s]








 72%|███████▏  | 912/1261 [02:22<00:52,  6.62it/s]








 72%|███████▏  | 913/1261 [02:22<00:52,  6.66it/s]








 72%|███████▏  | 914/1261 [02:22<00:53,  6.53it/s]








 73%|███████▎  | 915/1261 [02:22<00:52,  6.55it/s]








 73%|███████▎  | 916/1261 [02:22<00:52,  6.58it/s]








 73%|███████▎  | 917/1261 [02:22<00:52,  6.58it/s]








 73%|███████▎  | 918/1261 [02:23<00:53,  6.40it/s]








 73%|███████▎  | 919/1261 [02:23<00:52,  6.49it/s]








 73%|███████▎  | 920/1261 [02:23<00:51,  6.59it/s]








 73%|███████▎  | 921/1261 [02:23<00:51,  6.64it/s]








 73%|███████▎  | 922/1261 [02:23<00:52,  6.49it/s]








 73%|███████▎  | 923/1261 [02:23<00:51,  6.55it/s]








 73%|███████▎  | 924/1261 [02:24<00:51,  6.57it/s]








 73%|███████▎  | 925/1261 [02:24<00:50,  6.63it/s]








 73%|███████▎  | 926/1261 [02:24<00:52,  6.41it/s]








 74%|███████▎  | 927/1261 [02:24<00:51,  6.50it/s]








 74%|███████▎  | 928/1261 [02:24<00:50,  6.58it/s]








 74%|███████▎  | 929/1261 [02:24<00:49,  6.66it/s]








 74%|███████▍  | 930/1261 [02:24<00:51,  6.46it/s]








 74%|███████▍  | 931/1261 [02:25<00:50,  6.48it/s]








 74%|███████▍  | 932/1261 [02:25<00:50,  6.53it/s]








 74%|███████▍  | 933/1261 [02:25<00:49,  6.62it/s]








 74%|███████▍  | 934/1261 [02:25<00:50,  6.49it/s]








 74%|███████▍  | 935/1261 [02:25<00:49,  6.53it/s]








 74%|███████▍  | 936/1261 [02:25<00:49,  6.55it/s]








 74%|███████▍  | 937/1261 [02:26<00:49,  6.59it/s]








 74%|███████▍  | 938/1261 [02:26<00:50,  6.35it/s]








 74%|███████▍  | 939/1261 [02:26<00:49,  6.46it/s]








 75%|███████▍  | 940/1261 [02:26<00:49,  6.55it/s]








 75%|███████▍  | 941/1261 [02:26<00:48,  6.63it/s]








 75%|███████▍  | 942/1261 [02:26<00:48,  6.56it/s]








 75%|███████▍  | 943/1261 [02:26<00:48,  6.60it/s]








 75%|███████▍  | 944/1261 [02:27<00:47,  6.67it/s]








 75%|███████▍  | 945/1261 [02:27<00:47,  6.69it/s]








 75%|███████▌  | 946/1261 [02:27<00:47,  6.57it/s]








 75%|███████▌  | 947/1261 [02:27<00:47,  6.61it/s]








 75%|███████▌  | 948/1261 [02:27<00:46,  6.67it/s]








 75%|███████▌  | 949/1261 [02:27<00:46,  6.67it/s]








 75%|███████▌  | 950/1261 [02:27<00:47,  6.53it/s]








 75%|███████▌  | 951/1261 [02:28<00:47,  6.57it/s]








 75%|███████▌  | 952/1261 [02:28<00:46,  6.58it/s]








 76%|███████▌  | 953/1261 [02:28<00:46,  6.65it/s]








 76%|███████▌  | 954/1261 [02:28<00:47,  6.50it/s]








 76%|███████▌  | 955/1261 [02:28<00:46,  6.53it/s]








 76%|███████▌  | 956/1261 [02:28<00:46,  6.57it/s]








 76%|███████▌  | 957/1261 [02:29<00:45,  6.64it/s]








 76%|███████▌  | 958/1261 [02:29<00:47,  6.44it/s]








 76%|███████▌  | 959/1261 [02:29<00:46,  6.47it/s]








 76%|███████▌  | 960/1261 [02:29<00:46,  6.54it/s]








 76%|███████▌  | 961/1261 [02:29<00:45,  6.63it/s]








 76%|███████▋  | 962/1261 [02:29<00:46,  6.46it/s]








 76%|███████▋  | 963/1261 [02:29<00:45,  6.54it/s]








 76%|███████▋  | 964/1261 [02:30<00:44,  6.61it/s]








 77%|███████▋  | 965/1261 [02:30<00:44,  6.69it/s]








 77%|███████▋  | 966/1261 [02:30<00:45,  6.46it/s]








 77%|███████▋  | 967/1261 [02:30<00:44,  6.54it/s]








 77%|███████▋  | 968/1261 [02:30<00:44,  6.62it/s]








 77%|███████▋  | 969/1261 [02:30<00:43,  6.72it/s]








 77%|███████▋  | 970/1261 [02:31<00:44,  6.60it/s]








 77%|███████▋  | 971/1261 [02:31<00:43,  6.61it/s]








 77%|███████▋  | 972/1261 [02:31<00:43,  6.61it/s]








 77%|███████▋  | 973/1261 [02:31<00:44,  6.47it/s]








 77%|███████▋  | 974/1261 [02:31<00:44,  6.38it/s]








 77%|███████▋  | 975/1261 [02:31<00:44,  6.46it/s]








 77%|███████▋  | 976/1261 [02:31<00:43,  6.54it/s]








 77%|███████▋  | 977/1261 [02:32<00:43,  6.57it/s]








 78%|███████▊  | 978/1261 [02:32<00:44,  6.39it/s]








 78%|███████▊  | 979/1261 [02:32<00:43,  6.46it/s]








 78%|███████▊  | 980/1261 [02:32<00:42,  6.55it/s]








 78%|███████▊  | 981/1261 [02:32<00:42,  6.61it/s]








 78%|███████▊  | 982/1261 [02:32<00:42,  6.52it/s]








 78%|███████▊  | 983/1261 [02:33<00:41,  6.62it/s]








 78%|███████▊  | 984/1261 [02:33<00:41,  6.71it/s]








 78%|███████▊  | 985/1261 [02:33<00:40,  6.75it/s]








 78%|███████▊  | 986/1261 [02:33<00:41,  6.63it/s]








 78%|███████▊  | 987/1261 [02:33<00:41,  6.63it/s]








 78%|███████▊  | 988/1261 [02:33<00:40,  6.71it/s]








 78%|███████▊  | 989/1261 [02:33<00:41,  6.63it/s]








 79%|███████▊  | 990/1261 [02:34<00:41,  6.49it/s]








 79%|███████▊  | 991/1261 [02:34<00:41,  6.49it/s]








 79%|███████▊  | 992/1261 [02:34<00:41,  6.51it/s]








 79%|███████▊  | 993/1261 [02:34<00:40,  6.58it/s]








 79%|███████▉  | 994/1261 [02:34<00:41,  6.40it/s]








 79%|███████▉  | 995/1261 [02:34<00:41,  6.41it/s]








 79%|███████▉  | 996/1261 [02:35<00:40,  6.50it/s]








 79%|███████▉  | 997/1261 [02:35<00:40,  6.59it/s]








 79%|███████▉  | 998/1261 [02:35<00:40,  6.47it/s]








 79%|███████▉  | 999/1261 [02:35<00:40,  6.49it/s]








 79%|███████▉  | 1000/1261 [02:35<00:39,  6.53it/s]








 79%|███████▉  | 1001/1261 [02:35<00:39,  6.62it/s]








 79%|███████▉  | 1002/1261 [02:35<00:40,  6.38it/s]








 80%|███████▉  | 1003/1261 [02:36<00:39,  6.48it/s]








 80%|███████▉  | 1004/1261 [02:36<00:39,  6.56it/s]








 80%|███████▉  | 1005/1261 [02:36<00:38,  6.60it/s]








 80%|███████▉  | 1006/1261 [02:36<00:39,  6.48it/s]








 80%|███████▉  | 1007/1261 [02:36<00:38,  6.54it/s]








 80%|███████▉  | 1008/1261 [02:36<00:38,  6.58it/s]








 80%|████████  | 1009/1261 [02:37<00:38,  6.60it/s]








 80%|████████  | 1010/1261 [02:37<00:39,  6.33it/s]








 80%|████████  | 1011/1261 [02:37<00:42,  5.89it/s]








 80%|████████  | 1012/1261 [02:37<00:41,  6.02it/s]








 80%|████████  | 1013/1261 [02:37<00:39,  6.21it/s]








 80%|████████  | 1014/1261 [02:37<00:41,  5.98it/s]








 80%|████████  | 1015/1261 [02:38<00:43,  5.64it/s]








 81%|████████  | 1016/1261 [02:38<00:41,  5.88it/s]








 81%|████████  | 1017/1261 [02:38<00:40,  6.06it/s]








 81%|████████  | 1018/1261 [02:38<00:40,  6.05it/s]








 81%|████████  | 1019/1261 [02:38<00:38,  6.22it/s]








 81%|████████  | 1020/1261 [02:38<00:38,  6.30it/s]








 81%|████████  | 1021/1261 [02:39<00:38,  6.27it/s]








 81%|████████  | 1022/1261 [02:39<00:39,  6.08it/s]








 81%|████████  | 1023/1261 [02:39<00:39,  6.04it/s]








 81%|████████  | 1024/1261 [02:39<00:38,  6.12it/s]








 81%|████████▏ | 1025/1261 [02:39<00:37,  6.26it/s]








 81%|████████▏ | 1026/1261 [02:39<00:38,  6.15it/s]








 81%|████████▏ | 1027/1261 [02:39<00:38,  6.04it/s]








 82%|████████▏ | 1028/1261 [02:40<00:37,  6.14it/s]








 82%|████████▏ | 1029/1261 [02:40<00:36,  6.28it/s]








 82%|████████▏ | 1030/1261 [02:40<00:37,  6.18it/s]








 82%|████████▏ | 1031/1261 [02:40<00:36,  6.27it/s]








 82%|████████▏ | 1032/1261 [02:40<00:35,  6.37it/s]








 82%|████████▏ | 1033/1261 [02:40<00:35,  6.42it/s]








 82%|████████▏ | 1034/1261 [02:41<00:36,  6.28it/s]








 82%|████████▏ | 1035/1261 [02:41<00:35,  6.35it/s]








 82%|████████▏ | 1036/1261 [02:41<00:35,  6.38it/s]








 82%|████████▏ | 1037/1261 [02:41<00:35,  6.38it/s]








 82%|████████▏ | 1038/1261 [02:41<00:36,  6.06it/s]








 82%|████████▏ | 1039/1261 [02:41<00:37,  5.87it/s]








 82%|████████▏ | 1040/1261 [02:42<00:38,  5.78it/s]








 83%|████████▎ | 1041/1261 [02:42<00:39,  5.60it/s]








 83%|████████▎ | 1042/1261 [02:42<00:40,  5.38it/s]








 83%|████████▎ | 1043/1261 [02:42<00:41,  5.20it/s]








 83%|████████▎ | 1044/1261 [02:42<00:41,  5.24it/s]








 83%|████████▎ | 1045/1261 [02:43<00:40,  5.29it/s]








 83%|████████▎ | 1046/1261 [02:43<00:40,  5.29it/s]








 83%|████████▎ | 1047/1261 [02:43<00:39,  5.35it/s]








 83%|████████▎ | 1048/1261 [02:43<00:39,  5.38it/s]








 83%|████████▎ | 1049/1261 [02:43<00:38,  5.51it/s]








 83%|████████▎ | 1050/1261 [02:43<00:37,  5.66it/s]








 83%|████████▎ | 1051/1261 [02:44<00:35,  5.84it/s]








 83%|████████▎ | 1052/1261 [02:44<00:35,  5.81it/s]








 84%|████████▎ | 1053/1261 [02:44<00:34,  6.01it/s]








 84%|████████▎ | 1054/1261 [02:44<00:33,  6.24it/s]








 84%|████████▎ | 1055/1261 [02:44<00:31,  6.46it/s]








 84%|████████▎ | 1056/1261 [02:44<00:32,  6.34it/s]








 84%|████████▍ | 1057/1261 [02:45<00:31,  6.39it/s]








 84%|████████▍ | 1058/1261 [02:45<00:31,  6.53it/s]








 84%|████████▍ | 1059/1261 [02:45<00:30,  6.59it/s]








 84%|████████▍ | 1060/1261 [02:45<00:31,  6.47it/s]








 84%|████████▍ | 1061/1261 [02:45<00:30,  6.51it/s]








 84%|████████▍ | 1062/1261 [02:45<00:30,  6.62it/s]








 84%|████████▍ | 1063/1261 [02:45<00:29,  6.62it/s]








 84%|████████▍ | 1064/1261 [02:46<00:30,  6.50it/s]








 84%|████████▍ | 1065/1261 [02:46<00:30,  6.50it/s]








 85%|████████▍ | 1066/1261 [02:46<00:29,  6.60it/s]








 85%|████████▍ | 1067/1261 [02:46<00:29,  6.64it/s]








 85%|████████▍ | 1068/1261 [02:46<00:29,  6.50it/s]








 85%|████████▍ | 1069/1261 [02:46<00:29,  6.53it/s]








 85%|████████▍ | 1070/1261 [02:47<00:28,  6.62it/s]








 85%|████████▍ | 1071/1261 [02:47<00:28,  6.68it/s]








 85%|████████▌ | 1072/1261 [02:47<00:29,  6.49it/s]








 85%|████████▌ | 1073/1261 [02:47<00:28,  6.53it/s]








 85%|████████▌ | 1074/1261 [02:47<00:28,  6.63it/s]








 85%|████████▌ | 1075/1261 [02:47<00:27,  6.68it/s]








 85%|████████▌ | 1076/1261 [02:47<00:28,  6.49it/s]








 85%|████████▌ | 1077/1261 [02:48<00:27,  6.57it/s]








 85%|████████▌ | 1078/1261 [02:48<00:27,  6.62it/s]








 86%|████████▌ | 1079/1261 [02:48<00:27,  6.69it/s]








 86%|████████▌ | 1080/1261 [02:48<00:27,  6.51it/s]








 86%|████████▌ | 1081/1261 [02:48<00:27,  6.58it/s]








 86%|████████▌ | 1082/1261 [02:48<00:26,  6.65it/s]








 86%|████████▌ | 1083/1261 [02:48<00:26,  6.71it/s]








 86%|████████▌ | 1084/1261 [02:49<00:26,  6.66it/s]








 86%|████████▌ | 1085/1261 [02:49<00:26,  6.70it/s]








 86%|████████▌ | 1086/1261 [02:49<00:25,  6.76it/s]








 86%|████████▌ | 1087/1261 [02:49<00:25,  6.78it/s]








 86%|████████▋ | 1088/1261 [02:49<00:25,  6.68it/s]








 86%|████████▋ | 1089/1261 [02:49<00:25,  6.69it/s]








 86%|████████▋ | 1090/1261 [02:50<00:25,  6.74it/s]








 87%|████████▋ | 1091/1261 [02:50<00:25,  6.75it/s]








 87%|████████▋ | 1092/1261 [02:50<00:25,  6.63it/s]








 87%|████████▋ | 1093/1261 [02:50<00:25,  6.47it/s]








 87%|████████▋ | 1094/1261 [02:50<00:26,  6.35it/s]








 87%|████████▋ | 1095/1261 [02:50<00:25,  6.49it/s]








 87%|████████▋ | 1096/1261 [02:50<00:25,  6.56it/s]








 87%|████████▋ | 1097/1261 [02:51<00:24,  6.62it/s]








 87%|████████▋ | 1098/1261 [02:51<00:24,  6.55it/s]








 87%|████████▋ | 1099/1261 [02:51<00:24,  6.64it/s]








 87%|████████▋ | 1100/1261 [02:51<00:24,  6.69it/s]








 87%|████████▋ | 1101/1261 [02:51<00:23,  6.71it/s]








 87%|████████▋ | 1102/1261 [02:51<00:24,  6.60it/s]








 87%|████████▋ | 1103/1261 [02:52<00:23,  6.60it/s]








 88%|████████▊ | 1104/1261 [02:52<00:23,  6.67it/s]








 88%|████████▊ | 1105/1261 [02:52<00:23,  6.72it/s]








 88%|████████▊ | 1106/1261 [02:52<00:23,  6.66it/s]








 88%|████████▊ | 1107/1261 [02:52<00:23,  6.67it/s]








 88%|████████▊ | 1108/1261 [02:52<00:22,  6.67it/s]








 88%|████████▊ | 1109/1261 [02:52<00:22,  6.73it/s]








 88%|████████▊ | 1110/1261 [02:53<00:22,  6.62it/s]








 88%|████████▊ | 1111/1261 [02:53<00:22,  6.67it/s]








 88%|████████▊ | 1112/1261 [02:53<00:22,  6.73it/s]








 88%|████████▊ | 1113/1261 [02:53<00:22,  6.72it/s]








 88%|████████▊ | 1114/1261 [02:53<00:22,  6.57it/s]








 88%|████████▊ | 1115/1261 [02:53<00:21,  6.64it/s]








 89%|████████▊ | 1116/1261 [02:53<00:21,  6.67it/s]








 89%|████████▊ | 1117/1261 [02:54<00:21,  6.73it/s]








 89%|████████▊ | 1118/1261 [02:54<00:21,  6.59it/s]








 89%|████████▊ | 1119/1261 [02:54<00:21,  6.60it/s]








 89%|████████▉ | 1120/1261 [02:54<00:21,  6.63it/s]








 89%|████████▉ | 1121/1261 [02:54<00:21,  6.61it/s]








 89%|████████▉ | 1122/1261 [02:54<00:21,  6.48it/s]








 89%|████████▉ | 1123/1261 [02:55<00:21,  6.52it/s]








 89%|████████▉ | 1124/1261 [02:55<00:20,  6.62it/s]








 89%|████████▉ | 1125/1261 [02:55<00:20,  6.62it/s]








 89%|████████▉ | 1126/1261 [02:55<00:20,  6.48it/s]








 89%|████████▉ | 1127/1261 [02:55<00:20,  6.58it/s]








 89%|████████▉ | 1128/1261 [02:55<00:19,  6.67it/s]








 90%|████████▉ | 1129/1261 [02:55<00:19,  6.66it/s]








 90%|████████▉ | 1130/1261 [02:56<00:20,  6.52it/s]








 90%|████████▉ | 1131/1261 [02:56<00:19,  6.58it/s]








 90%|████████▉ | 1132/1261 [02:56<00:19,  6.60it/s]








 90%|████████▉ | 1133/1261 [02:56<00:19,  6.67it/s]








 90%|████████▉ | 1134/1261 [02:56<00:19,  6.49it/s]








 90%|█████████ | 1135/1261 [02:56<00:19,  6.58it/s]








 90%|█████████ | 1136/1261 [02:57<00:18,  6.62it/s]








 90%|█████████ | 1137/1261 [02:57<00:18,  6.67it/s]








 90%|█████████ | 1138/1261 [02:57<00:18,  6.57it/s]








 90%|█████████ | 1139/1261 [02:57<00:18,  6.58it/s]








 90%|█████████ | 1140/1261 [02:57<00:18,  6.62it/s]








 90%|█████████ | 1141/1261 [02:57<00:17,  6.73it/s]








 91%|█████████ | 1142/1261 [02:57<00:18,  6.61it/s]








 91%|█████████ | 1143/1261 [02:58<00:17,  6.68it/s]








 91%|█████████ | 1144/1261 [02:58<00:17,  6.76it/s]








 91%|█████████ | 1145/1261 [02:58<00:17,  6.79it/s]








 91%|█████████ | 1146/1261 [02:58<00:17,  6.60it/s]








 91%|█████████ | 1147/1261 [02:58<00:17,  6.67it/s]








 91%|█████████ | 1148/1261 [02:58<00:16,  6.74it/s]








 91%|█████████ | 1149/1261 [02:58<00:16,  6.79it/s]








 91%|█████████ | 1150/1261 [02:59<00:16,  6.64it/s]








 91%|█████████▏| 1151/1261 [02:59<00:16,  6.68it/s]








 91%|█████████▏| 1152/1261 [02:59<00:16,  6.68it/s]








 91%|█████████▏| 1153/1261 [02:59<00:16,  6.72it/s]








 92%|█████████▏| 1154/1261 [02:59<00:16,  6.59it/s]








 92%|█████████▏| 1155/1261 [02:59<00:15,  6.63it/s]








 92%|█████████▏| 1156/1261 [02:59<00:15,  6.65it/s]








 92%|█████████▏| 1157/1261 [03:00<00:15,  6.70it/s]








 92%|█████████▏| 1158/1261 [03:00<00:15,  6.59it/s]








 92%|█████████▏| 1159/1261 [03:00<00:15,  6.61it/s]








 92%|█████████▏| 1160/1261 [03:00<00:15,  6.66it/s]








 92%|█████████▏| 1161/1261 [03:00<00:14,  6.70it/s]








 92%|█████████▏| 1162/1261 [03:00<00:14,  6.62it/s]








 92%|█████████▏| 1163/1261 [03:01<00:14,  6.69it/s]








 92%|█████████▏| 1164/1261 [03:01<00:14,  6.70it/s]








 92%|█████████▏| 1165/1261 [03:01<00:14,  6.70it/s]








 92%|█████████▏| 1166/1261 [03:01<00:14,  6.50it/s]








 93%|█████████▎| 1167/1261 [03:01<00:14,  6.58it/s]








 93%|█████████▎| 1168/1261 [03:01<00:13,  6.67it/s]








 93%|█████████▎| 1169/1261 [03:01<00:13,  6.72it/s]








 93%|█████████▎| 1170/1261 [03:02<00:13,  6.71it/s]








 93%|█████████▎| 1171/1261 [03:02<00:13,  6.74it/s]








 93%|█████████▎| 1172/1261 [03:02<00:13,  6.79it/s]








 93%|█████████▎| 1173/1261 [03:02<00:12,  6.86it/s]








 93%|█████████▎| 1174/1261 [03:02<00:12,  6.72it/s]








 93%|█████████▎| 1175/1261 [03:02<00:12,  6.74it/s]








 93%|█████████▎| 1176/1261 [03:02<00:12,  6.75it/s]








 93%|█████████▎| 1177/1261 [03:03<00:12,  6.81it/s]








 93%|█████████▎| 1178/1261 [03:03<00:12,  6.65it/s]








 93%|█████████▎| 1179/1261 [03:03<00:12,  6.67it/s]








 94%|█████████▎| 1180/1261 [03:03<00:12,  6.74it/s]








 94%|█████████▎| 1181/1261 [03:03<00:11,  6.73it/s]








 94%|█████████▎| 1182/1261 [03:03<00:11,  6.65it/s]








 94%|█████████▍| 1183/1261 [03:04<00:11,  6.69it/s]








 94%|█████████▍| 1184/1261 [03:04<00:11,  6.77it/s]








 94%|█████████▍| 1185/1261 [03:04<00:11,  6.81it/s]








 94%|█████████▍| 1186/1261 [03:04<00:11,  6.75it/s]








 94%|█████████▍| 1187/1261 [03:04<00:10,  6.80it/s]








 94%|█████████▍| 1188/1261 [03:04<00:10,  6.79it/s]








 94%|█████████▍| 1189/1261 [03:04<00:10,  6.77it/s]








 94%|█████████▍| 1190/1261 [03:05<00:10,  6.60it/s]








 94%|█████████▍| 1191/1261 [03:05<00:10,  6.64it/s]








 95%|█████████▍| 1192/1261 [03:05<00:10,  6.69it/s]








 95%|█████████▍| 1193/1261 [03:05<00:10,  6.73it/s]








 95%|█████████▍| 1194/1261 [03:05<00:10,  6.58it/s]








 95%|█████████▍| 1195/1261 [03:05<00:09,  6.66it/s]








 95%|█████████▍| 1196/1261 [03:05<00:09,  6.70it/s]








 95%|█████████▍| 1197/1261 [03:06<00:09,  6.75it/s]








 95%|█████████▌| 1198/1261 [03:06<00:09,  6.61it/s]








 95%|█████████▌| 1199/1261 [03:06<00:09,  6.66it/s]








 95%|█████████▌| 1200/1261 [03:06<00:09,  6.72it/s]








 95%|█████████▌| 1201/1261 [03:06<00:08,  6.70it/s]








 95%|█████████▌| 1202/1261 [03:06<00:08,  6.60it/s]








 95%|█████████▌| 1203/1261 [03:07<00:08,  6.69it/s]








 95%|█████████▌| 1204/1261 [03:07<00:08,  6.66it/s]








 96%|█████████▌| 1205/1261 [03:07<00:08,  6.68it/s]








 96%|█████████▌| 1206/1261 [03:07<00:08,  6.55it/s]








 96%|█████████▌| 1207/1261 [03:07<00:08,  6.61it/s]








 96%|█████████▌| 1208/1261 [03:07<00:07,  6.69it/s]








 96%|█████████▌| 1209/1261 [03:07<00:07,  6.75it/s]








 96%|█████████▌| 1210/1261 [03:08<00:07,  6.68it/s]








 96%|█████████▌| 1211/1261 [03:08<00:07,  6.68it/s]








 96%|█████████▌| 1212/1261 [03:08<00:07,  6.77it/s]








 96%|█████████▌| 1213/1261 [03:08<00:07,  6.78it/s]








 96%|█████████▋| 1214/1261 [03:08<00:07,  6.64it/s]








 96%|█████████▋| 1215/1261 [03:08<00:06,  6.65it/s]








 96%|█████████▋| 1216/1261 [03:08<00:06,  6.69it/s]








 97%|█████████▋| 1217/1261 [03:09<00:06,  6.69it/s]








 97%|█████████▋| 1218/1261 [03:09<00:06,  6.54it/s]








 97%|█████████▋| 1219/1261 [03:09<00:06,  6.60it/s]








 97%|█████████▋| 1220/1261 [03:09<00:06,  6.67it/s]








 97%|█████████▋| 1221/1261 [03:09<00:06,  6.66it/s]








 97%|█████████▋| 1222/1261 [03:09<00:06,  6.47it/s]








 97%|█████████▋| 1223/1261 [03:10<00:05,  6.55it/s]








 97%|█████████▋| 1224/1261 [03:10<00:05,  6.62it/s]








 97%|█████████▋| 1225/1261 [03:10<00:05,  6.62it/s]








 97%|█████████▋| 1226/1261 [03:10<00:05,  6.56it/s]








 97%|█████████▋| 1227/1261 [03:10<00:05,  6.64it/s]








 97%|█████████▋| 1228/1261 [03:10<00:04,  6.67it/s]








 97%|█████████▋| 1229/1261 [03:10<00:04,  6.73it/s]








 98%|█████████▊| 1230/1261 [03:11<00:04,  6.63it/s]








 98%|█████████▊| 1231/1261 [03:11<00:04,  6.67it/s]








 98%|█████████▊| 1232/1261 [03:11<00:04,  6.66it/s]








 98%|█████████▊| 1233/1261 [03:11<00:04,  6.69it/s]








 98%|█████████▊| 1234/1261 [03:11<00:04,  6.55it/s]








 98%|█████████▊| 1235/1261 [03:11<00:03,  6.64it/s]








 98%|█████████▊| 1236/1261 [03:11<00:03,  6.70it/s]








 98%|█████████▊| 1237/1261 [03:12<00:03,  6.74it/s]








 98%|█████████▊| 1238/1261 [03:12<00:03,  6.63it/s]








 98%|█████████▊| 1239/1261 [03:12<00:03,  6.66it/s]








 98%|█████████▊| 1240/1261 [03:12<00:03,  6.71it/s]








 98%|█████████▊| 1241/1261 [03:12<00:02,  6.71it/s]








 98%|█████████▊| 1242/1261 [03:12<00:02,  6.58it/s]








 99%|█████████▊| 1243/1261 [03:13<00:02,  6.67it/s]








 99%|█████████▊| 1244/1261 [03:13<00:02,  6.71it/s]








 99%|█████████▊| 1245/1261 [03:13<00:02,  6.72it/s]








 99%|█████████▉| 1246/1261 [03:13<00:02,  6.56it/s]








 99%|█████████▉| 1247/1261 [03:13<00:02,  6.58it/s]








 99%|█████████▉| 1248/1261 [03:13<00:01,  6.71it/s]








 99%|█████████▉| 1249/1261 [03:13<00:01,  6.76it/s]








 99%|█████████▉| 1250/1261 [03:14<00:01,  6.69it/s]








 99%|█████████▉| 1251/1261 [03:14<00:01,  6.74it/s]








 99%|█████████▉| 1252/1261 [03:14<00:01,  6.74it/s]








 99%|█████████▉| 1253/1261 [03:14<00:01,  6.80it/s]








 99%|█████████▉| 1254/1261 [03:14<00:01,  6.73it/s]








100%|█████████▉| 1255/1261 [03:14<00:00,  6.80it/s]








100%|█████████▉| 1256/1261 [03:14<00:00,  6.85it/s]








100%|█████████▉| 1257/1261 [03:15<00:00,  6.90it/s]








100%|█████████▉| 1258/1261 [03:15<00:00,  6.74it/s]








100%|█████████▉| 1259/1261 [03:15<00:00,  6.80it/s]








100%|█████████▉| 1260/1261 [03:15<00:00,  6.82it/s]








[MoviePy] Done.
[MoviePy] >>>> Video ready: output_images/project_video_output.mp4 

CPU times: user 3min 9s, sys: 41.1 s, total: 3min 51s
Wall time: 3min 16s
In [66]:
HTML("""
<video width="960" height="540" controls>
  <source = src="{0}">
</video>
""".format(output_dir))
Out[66]:
In [ ]:
 
In [ ]:
 

class : Lane

In [232]:
import cv2
import numpy as np
import matplotlib.image as mpimg
import matplotlib.pyplot as plt

class Lane :
    def __init__(self, _nwindows = 9, _margin = 80, _minpix = 40, _n_iter = 10) :
        # HYPERPARAMETERS
        # Choose the number of sliding windows
        # Set the width of the windows +/- margin
        # Set minimum number of pixels found to recenter window
        self.nwindows = _nwindows
        self.margin = _margin
        self.minpix = _minpix

        self.Line_thinkness = 15

        self.n_iter = _n_iter

        self.ploty = None

        # Define conversions in x and y from pixels space to meters
        self.ym_per_pix = 30/720 # meters per pixel in y dimension
        self.xm_per_pix = 3.7/650 # meters per pixel in x dimension

        self.out_img = []
        self.histogram = []
        self.result = []

        # was the line detected in the last iteration?
        self.detected_left = False  
        self.detected_right = False
        # x values of the last n fits of the line
        # self.recent_xfitted = [] 
        self.recent_xfitted_left = []
        self.recent_xfitted_right = []
        #average x values of the fitted line over the last n iterations
        self.bestx_left = None  
        self.bestx_right = None     
        #polynomial coefficients averaged over the last n iterations
        self.best_fit_left = None
        self.best_fit_right = None
        #polynomial coefficients for the most recent fit
        self.current_fit_left = [np.array([False])]  
        self.current_fit_right = [np.array([False])]  
        #radius of curvature of the line in some units
        self.radius_of_curvature = None 
        #distance in meters of vehicle center from the line
        self.line_base_pos = None 
        self.diff_pos = None
        #difference in fit coefficients between last and new fits
        self.diffs_left = np.array([0,0,0], dtype='float') 
        self.diffs_right = np.array([0,0,0], dtype='float') 
        #x values for detected line pixels
        # self.allx = None  
        #y values for detected line pixels
        # self.ally = None  

    def find_lane_pixels(self, _img_b, _draw_img, _visualization = False) :
        # Take a histogram of the bottom half of the image
        histogram = np.sum(_img_b[_img_b.shape[0]//2:,:], axis=0)
        self.histogram = np.copy(histogram)
        # Create an output image to draw on and visualize the result
        if (_visualization) :
            out_img = np.dstack((_img_b, _img_b, _img_b))
        # Find the peak of the left and right halves of the histogram
        # These will be the starting point for the left and right lines
        midpoint = np.int(histogram.shape[0]//2)
        leftx_base = np.argmax(histogram[:midpoint])
        rightx_base = np.argmax(histogram[midpoint:]) + midpoint

        # Set height of windows - based on self.nwindows above and image shape
        window_height = np.int(_img_b.shape[0]//self.nwindows)
        # Identify the x and y positions of all nonzero pixels in the image
        nonzero = _img_b.nonzero()
        nonzeroy = np.array(nonzero[0])
        nonzerox = np.array(nonzero[1])
        # Current positions to be updated later for each window in self.nwindows
        leftx_current = leftx_base
        rightx_current = rightx_base

        # Create empty lists to receive left and right lane pixel indices
        left_lane_inds = []
        right_lane_inds = []

        # Step through the windows one by one
        for window in range(self.nwindows):
            # Identify window boundaries in x and y (and right and left)
            win_y_low = _img_b.shape[0] - (window+1)*window_height
            win_y_high = _img_b.shape[0] - window*window_height
            ### TO-DO: Find the four below boundaries of the window ###
            win_xleft_low = leftx_current - self.margin  # Update this
            win_xleft_high = leftx_current + self.margin  # Update this
            win_xright_low = rightx_current - self.margin  # Update this
            win_xright_high = rightx_current + self.margin  # Update this
            
            # Draw the windows on the visualization image
#             if (_visualization) :
#                 cv2.rectangle(_draw_img,(win_xleft_low,win_y_low),
#                 (win_xleft_high,win_y_high),(0,255,0), 2) 
#                 cv2.rectangle(_draw_img,(win_xright_low,win_y_low),
#                 (win_xright_high,win_y_high),(0,255,0), 2) 
            
            ### TO-DO: Identify the nonzero pixels in x and y within the window ###
            good_left_inds = ((nonzeroy >= win_y_low) & (nonzeroy < win_y_high) & 
            (nonzerox >= win_xleft_low) &  (nonzerox < win_xleft_high)).nonzero()[0]
            good_right_inds = ((nonzeroy >= win_y_low) & (nonzeroy < win_y_high) & 
            (nonzerox >= win_xright_low) &  (nonzerox < win_xright_high)).nonzero()[0]
            
            # Append these indices to the lists
            left_lane_inds.append(good_left_inds)
            right_lane_inds.append(good_right_inds)
            
            ### TO-DO: If you found > self.minpix pixels, recenter next window ###
            ### (`right` or `leftx_current`) on their mean position ###
            # pass # Remove this when you add your function
            if (len(good_left_inds) > self.minpix) :
                leftx_current = np.int(np.mean(nonzerox[good_left_inds]))
            if len(good_right_inds) > self.minpix:        
                rightx_current = np.int(np.mean(nonzerox[good_right_inds]))

        # Concatenate the arrays of indices (previously was a list of lists of pixels)
        try:
            left_lane_inds = np.concatenate(left_lane_inds)
            right_lane_inds = np.concatenate(right_lane_inds)
        except ValueError:
            # Avoids an error if the above is not implemented fully
            pass

        # Extract left and right line pixel positions
        leftx = nonzerox[left_lane_inds]
        lefty = nonzeroy[left_lane_inds] 
        rightx = nonzerox[right_lane_inds]
        righty = nonzeroy[right_lane_inds]

#         if (_visualization) :
#             self.out_img = np.copy(_draw_img)

        return leftx, lefty, rightx, righty


    def fit_polynomial(self, _img_b, _leftx, _lefty, 
                            _rightx, _righty, 
                            _visualization = False) :
        ### TO-DO: Fit a second order polynomial to each using `np.polyfit` ###
        left_fit = np.polyfit(_lefty, _leftx, 2)
        right_fit = np.polyfit(_righty, _rightx, 2)

        # Generate x and y values for plotting
        ploty = np.linspace(0, _img_b.shape[0]-1, _img_b.shape[0] )
        try:
            left_fitx = left_fit[0]*ploty**2 + left_fit[1]*ploty + left_fit[2]
            right_fitx = right_fit[0]*ploty**2 + right_fit[1]*ploty + right_fit[2]
        except TypeError:
            # Avoids an error if `left` and `right_fit` are still none or incorrect
            print('The function failed to fit a line!')
            left_fitx = 1*ploty**2 + 1*ploty
            right_fitx = 1*ploty**2 + 1*ploty

        ## Visualization ##
        # if (_visualization) :
        #     # Colors in the left and right lane regions
        #     self.out_img[_lefty, _leftx] = [255, 0, 0]
        #     self.out_img[_righty, _rightx] = [0, 0, 255]

        #     # Plots the left and right polynomials on the lane lines
        #     plt.plot(left_fitx, ploty, color='yellow')
        #     plt.plot(right_fitx, ploty, color='yellow')
        
        return left_fitx, right_fitx, left_fit, right_fit

    def search_around_poly(self, _img_b, _draw_img, _left_fit, _right_fit, 
                            _visualization = False) :
        # Grab activated pixels
        nonzero = _img_b.nonzero()
        nonzeroy = np.array(nonzero[0])
        nonzerox = np.array(nonzero[1])
        
        ### TO-DO: Set the area of search based on activated x-values ###
        ### within the +/- margin of our polynomial function ###
        ### Hint: consider the window areas for the similarly named variables ###
        ### in the previous quiz, but change the windows to our new search area ###
        left_lane_inds = (nonzerox > (_left_fit[0] * nonzeroy ** 2 + _left_fit[1] * nonzeroy + _left_fit[2] - self.margin)) & \
                        (nonzerox < (_left_fit[0] * nonzeroy ** 2 + _left_fit[1] * nonzeroy + _left_fit[2] + self.margin))
        right_lane_inds = (nonzerox > (_right_fit[0] * nonzeroy ** 2 + _right_fit[1] * nonzeroy + _right_fit[2] - self.margin)) & \
                        (nonzerox < (_right_fit[0] * nonzeroy ** 2 + _right_fit[1] * nonzeroy + _right_fit[2] + self.margin))
        
        # Again, extract left and right line pixel positions
        leftx = nonzerox[left_lane_inds]
        lefty = nonzeroy[left_lane_inds] 
        rightx = nonzerox[right_lane_inds]
        righty = nonzeroy[right_lane_inds]

        # Fit new polynomials
        left_fitx, right_fitx, left_fit, right_fit = self.fit_polynomial(_img_b, leftx, lefty, 
                                    rightx, righty, _visualization = _visualization)
        ploty = np.linspace(0, _img_b.shape[0]-1, _img_b.shape[0])
        
        

        ## Visualization ##
        # Show search margin
        '''
        if _visualization :
            # Create an image to draw on and an image to show the selection window
            # out_img = np.dstack((_img_b, _img_b, _img_b))*255
            window_img = np.zeros_like(_draw_img)
            # Color in left and right line pixels
            _draw_img[nonzeroy[left_lane_inds], nonzerox[left_lane_inds]] = [255, 0, 0]
            _draw_img[nonzeroy[right_lane_inds], nonzerox[right_lane_inds]] = [0, 0, 255]

            # Generate a polygon to illustrate the search window area
            # And recast the x and y points into usable format for cv2.fillPoly()
            left_line_window1 = np.array([np.transpose(np.vstack([left_fitx-self.margin, ploty]))])
            left_line_window2 = np.array([np.flipud(np.transpose(np.vstack([left_fitx+self.margin, 
                                    ploty])))])
            left_line_pts = np.hstack((left_line_window1, left_line_window2))
            right_line_window1 = np.array([np.transpose(np.vstack([right_fitx-self.margin, ploty]))])
            right_line_window2 = np.array([np.flipud(np.transpose(np.vstack([right_fitx+self.margin, 
                                    ploty])))])
            right_line_pts = np.hstack((right_line_window1, right_line_window2))

            # Draw the lane onto the warped blank image
            cv2.fillPoly(window_img, np.int_([left_line_pts]), (0,255, 0))
            cv2.fillPoly(window_img, np.int_([right_line_pts]), (0,255, 0))
            result = cv2.addWeighted(_draw_img, 1, window_img, 0.3, 0)
            
            # Plot the polynomial lines onto the image
            plt.plot(left_fitx, ploty, color='yellow')
            plt.plot(right_fitx, ploty, color='yellow')
            ## End visualization steps ##
            
            self.result = np.copy(result)
        '''

        return left_fitx, right_fitx, left_fit, right_fit
    
    def visualize(self, _draw_img, bestx_left, bestx_right) :
        # Create an image to draw on and an image to show the selection window
        # out_img = np.dstack((_img_b, _img_b, _img_b))*255

#         self.bestx_left = np.mean(self.recent_xfitted_left, 0)
#         self.bestx_right =  np.mean(self.recent_xfitted_right, 0)

        window_img = np.zeros_like(_draw_img)
        # Color in left and right line pixels
        # _draw_img[nonzeroy[left_lane_inds], nonzerox[left_lane_inds]] = [255, 0, 0]
        # _draw_img[nonzeroy[right_lane_inds], nonzerox[right_lane_inds]] = [0, 0, 255]

        # Generate a polygon to illustrate the search window area
        # And recast the x and y points into usable format for cv2.fillPoly()
        left_line_window1 = np.array([np.transpose(np.vstack([bestx_left-self.Line_thinkness, self.ploty]))])
        left_line_window2 = np.array([np.flipud(np.transpose(np.vstack([bestx_left+self.Line_thinkness, 
                                self.ploty])))])
        left_line_pts = np.hstack((left_line_window1, left_line_window2))
        right_line_window1 = np.array([np.transpose(np.vstack([bestx_right-self.Line_thinkness, self.ploty]))])
        right_line_window2 = np.array([np.flipud(np.transpose(np.vstack([bestx_right+self.Line_thinkness, 
                                self.ploty])))])
        right_line_pts = np.hstack((right_line_window1, right_line_window2))

        center_area_pts = np.hstack((left_line_window2, right_line_window1))

        # Draw the lane onto the warped blank image
        cv2.fillPoly(window_img, np.int_([left_line_pts]), (255, 0, 0))
        cv2.fillPoly(window_img, np.int_([right_line_pts]), (0, 0, 255))
        cv2.fillPoly(window_img, np.int_([center_area_pts]), (0, 255, 0))

        result = cv2.addWeighted(_draw_img, 1, window_img, 0.4, 0)

        # Plot the polynomial lines onto the image
        # plt.plot(left_fitx, ploty, color='yellow')
        # plt.plot(right_fitx, ploty, color='yellow')
        ## End visualization steps ##

        self.result = np.copy(result)

    def measure_curvature_real(self, _img_b, _left_fitx, _right_fitx):
        '''
        Calculates the curvature of polynomial functions in meters.
        '''
        ploty = np.linspace(0, _img_b.shape[0]-1, _img_b.shape[0])
        left_fit_cr = np.polyfit(ploty * self.ym_per_pix, _left_fitx * self.xm_per_pix, 2)
        right_fit_cr = np.polyfit(ploty * self.ym_per_pix, _right_fitx * self.xm_per_pix, 2)

        # Define y-value where we want radius of curvature
        # We'll choose the maximum y-value, corresponding to the bottom of the image
        
        y_eval = np.max(ploty)

        ##### TO-DO: Implement the calculation of R_curve (radius of curvature) #####
        left_curverad = ((1 + (2 * left_fit_cr[0] * y_eval * self.ym_per_pix+ left_fit_cr[1])**2 )**1.5) / (2 * np.abs(left_fit_cr[0]))
        right_curverad = ((1 + (2 * right_fit_cr[0] * y_eval * self.ym_per_pix + right_fit_cr[1])**2 )**1.5) / (2 * np.abs(right_fit_cr[0]))

        return left_curverad, right_curverad

    def processing(self, _img_b, _draw_img, _visualization = False) :
        if ((self.detected_left & self.detected_right)) :
            left_fitx, right_fitx, left_fit, right_fit = self.search_around_poly(_img_b, _draw_img, self.current_fit_left, self.current_fit_right
                                , _visualization = _visualization)
            
            self.diffs_left = np.abs(self.current_fit_left - left_fit)
            self.diffs_right = np.abs(self.current_fit_right - right_fit)
            
            if ((self.diffs_left[0] > 0.001) or (self.diffs_left[1] > 1.0) or (self.diffs_left[2] > 80.0)) :
                self.detected_left = False
#                 self.recent_xfitted_left = []
            else :
                self.recent_xfitted_left.append(left_fitx)
                
            if (self.diffs_right[0] > 0.001 or self.diffs_right[1] > 1.0 or self.diffs_right[2] > 80.0) :
                self.detected_right = False 
#                 self.recent_xfitted_right = []
            else :
                self.recent_xfitted_right.append(right_fitx)
                
            self.getBest()
                
#             left_curverad, right_curverad = self.measure_curvature_real(_img_b, left_fitx, right_fitx)
            left_curverad, right_curverad = self.measure_curvature_real(_img_b, self.recent_xfitted_left[-1], self.recent_xfitted_right[-1])
            
#             self.recent_xfitted_left.append(left_fitx)
#             self.recent_xfitted_right.append(right_fitx)

            self.visualize(_draw_img, self.bestx_left, self.bestx_right)

#             def getBest(self) :
#         self.bestx_left = np.mean(self.recent_xfitted_left, 0)
#         self.bestx_right =  np.mean(self.recent_xfitted_right, 0)

#         self.best_fit_left = np.polyfit(self.ploty, self.bestx_left, 2)
#         self.best_fit_right = np.polyfit(self.ploty, self.bestx_right, 2)

            self.current_fit_left = np.copy(self.best_fit_left) 
            self.current_fit_right = np.copy(self.best_fit_right)  

            _l = self.best_fit_left[0] * (720.0 ** 2) + self.best_fit_left[1] * 720.0 + self.best_fit_left[2]
            _r = self.best_fit_right[0] * (720.0 ** 2) + self.best_fit_right[1] * 720.0 + self.best_fit_right[2]
            self.diff_pos = (_l + _r) / 2 - self.line_base_pos

#             self.line_base_pos = ((right_curverad - left_curverad) / 2) + left_curverad
#             if (self.line_base_pos == None) :
#                 self.line_base_pos = ((right_curverad - left_curverad) / 2) + left_curverad
#             else :
#                 self.diff_pos = ((right_curverad - left_curverad) / 2) + left_curverad - self.line_base_pos

            self.radius_of_curvature = (left_curverad, right_curverad) 

            
            if (len(self.recent_xfitted_left) > self.n_iter) :
                self.recent_xfitted_left.remove(self.recent_xfitted_left[0])
            if (len(self.recent_xfitted_right) > self.n_iter) :   
                self.recent_xfitted_right.remove(self.recent_xfitted_right[0])
            
#             self.getBest()

        else :
            self.ploty = np.linspace(0, _img_b.shape[0]-1, _img_b.shape[0])
            leftx, lefty, rightx, righty = self.find_lane_pixels(_img_b, _draw_img, _visualization = _visualization)
            left_fitx, right_fitx, left_fit, right_fit = self.fit_polynomial(_img_b, leftx, lefty, 
                                                            rightx, righty, _visualization=_visualization)
#             left_curverad, right_curverad = self.measure_curvature_real(_img_b, left_fitx, right_fitx)
            
            if (len(self.recent_xfitted_left) > 0) :
                self.diffs_left = np.abs(self.current_fit_left - left_fit)
#                 print (self.diffs_left)
                if (self.diffs_left[0] > 0.001 or self.diffs_left[1] > 1.0 or self.diffs_left[2] > 80.0) :
                    self.detected_left = False
#                     self.recent_xfitted_left = []
                else :
                    self.recent_xfitted_left.append(left_fitx)
            else :
                self.recent_xfitted_left.append(left_fitx)
                self.detected_left = True
                    
            if (len(self.recent_xfitted_right) > 0) :
                self.diffs_right = np.abs(self.current_fit_right - right_fit)
#                 print ()
                if (self.diffs_right[0] > 0.001 or self.diffs_right[1] > 1.0 or self.diffs_right[2] > 80.0) :
                    self.detected_right = False
                else :
                    self.recent_xfitted_right.append(right_fitx)
            else :
                self.recent_xfitted_right.append(right_fitx)
                self.detected_right = True
            
            self.getBest()
                
#             left_curverad, right_curverad = self.measure_curvature_real(_img_b, left_fitx, right_fitx)
            left_curverad, right_curverad = self.measure_curvature_real(_img_b, self.recent_xfitted_left[-1], self.recent_xfitted_right[-1])
            
#             self.recent_xfitted_left.append(left_fitx)
#             self.recent_xfitted_right.append(right_fitx)

            self.visualize(_draw_img, self.bestx_left, self.bestx_right)
            
#             self.visualize(_draw_img, left_fitx, right_fitx)

#             self.recent_xfitted_left.append(left_fitx)
#             self.recent_xfitted_right.append(right_fitx)

            self.current_fit_left = np.copy(self.best_fit_left) 
            self.current_fit_right = np.copy(self.best_fit_right)
            
            if (self.line_base_pos == None) :
                _l = self.best_fit_left[0] * (720.0 ** 2) + self.best_fit_left[1] * 720.0 + self.best_fit_left[2]
                _r = self.best_fit_right[0] * (720.0 ** 2) + self.best_fit_right[1] * 720.0 + self.best_fit_right[2]
                self.line_base_pos = (_l + _r) / 2
                self.diff_pos = 0
            else :
                _l = self.best_fit_left[0] * (720.0 ** 2) + self.best_fit_left[1] * 720.0 + self.best_fit_left[2]
                _r = self.best_fit_right[0] * (720.0 ** 2) + self.best_fit_right[1] * 720.0 + self.best_fit_right[2]
                self.diff_pos = (_l + _r) / 2 - self.line_base_pos
                
                
            self.radius_of_curvature = (left_curverad, right_curverad) 
#             left_fitx, right_fitx, left_fit, right_fit = self.search_around_poly(_img_b, _draw_img, self.current_fit_left, self.current_fit_right
#                                 , _visualization = _visualization)
            if (len(self.recent_xfitted_left) > self.n_iter) :
                self.recent_xfitted_left.remove(self.recent_xfitted_left[0])
            if (len(self.recent_xfitted_right) > self.n_iter) :   
                self.recent_xfitted_right.remove(self.recent_xfitted_right[0])
    
        if (self.line_base_pos != None) :
            return self.diff_pos * self.xm_per_pix, np.mean(self.radius_of_curvature)
#             self.getBest()
        

    def getBest(self) :
        self.bestx_left = np.mean(self.recent_xfitted_left, 0)
        self.bestx_right =  np.mean(self.recent_xfitted_right, 0)
    
#         print (self.ploty.shape, self.bestx_left.shape, self.bestx_right.shape)
        
        self.best_fit_left = np.polyfit(self.ploty, self.bestx_left, 2)
        self.best_fit_right = np.polyfit(self.ploty, self.bestx_right, 2)

        # left_fitx point 
        # left_fit coeff

        # was the line detected in the last iteration?
        # self.detected = False  
        # x values of the last n fits of the line
        # self.recent_xfitted = [] 
        #average x values of the fitted line over the last n iterations
        # self.bestx = None     
        #polynomial coefficients averaged over the last n iterations
        # self.best_fit = None  
        #polynomial coefficients for the most recent fit
        # self.current_fit = [np.array([False])]  
        #radius of curvature of the line in some units
        # self.radius_of_curvature = None 
        #distance in meters of vehicle center from the line
        # self.line_base_pos = None 
        #difference in fit coefficients between last and new fits
        # self.diffs = np.array([0,0,0], dtype='float') 
        #x values for detected line pixels
        # self.allx = None  
        #y values for detected line pixels
        # self.ally = None 
In [ ]: